web-dev-qa-db-ja.com

jPanelに境界線を設定する方法は?

私のプロジェクトは2つのクラスで構成され、GoBoardはJPanelを拡張します。

GoTest.Java:

import javax.swing.*;
import Java.awt.Graphics;
import Java.io.*;
import Java.awt.*;

import javax.swing.border.Border;
import javax.swing.border.LineBorder;

class GoTest{
    private static void initGui(){
        JFrame frame = new JFrame("GoBoard");
        GoBoard jboard = new GoBoard();
        jboard.setLayout(new BorderLayout(10,10));
        jboard.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
        frame.add(jboard);



        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args){
        javax.swing.SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                initGui();
            }
        });
    }
}

GoBoard.Java:

import javax.swing.*;
import Java.awt.Graphics;
import javax.swing.border.Border;
class GoBoard extends JPanel{
    private int linien;

    public GoBoard(){
        this(9);    
    }

    public GoBoard(int pLinien){
        this.linien = pLinien;
        this.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        int d = 0;
        int h = 0;
        for(int i = 0; i < this.linien; i++){
            g.drawLine(0,h, getWidth(), h);
            g.drawLine(d,0,d,getHeight());
            h += getHeight()/this.linien;
            d +=getWidth()/this.linien;
        }
    }
}

パネルを表示するフレームに応じて、境界線にパディングを設定します。しかし、境界線はありません。何か案が?

17
Upvote

おそらく問題は、2つのコンストラクターのオーバーロードです。1つは境界線を設定し、もう1つは設定しません。

public GoBoard(){
    this.linien = 9;
    this.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
}

public GoBoard(int pLinien){
    this.linien = pLinien;

}

2番目のコンストラクターでGoBoardオブジェクトを作成し、intパラメーターを渡すと、空の境界線は作成されません。これを修正するには、両方のコンストラクターが境界を設定するようにこれを変更することを検討してください:

// default constructor
public GoBoard(){
    this(9);  // calls other constructor
}

public GoBoard(int pLinien){
    this.linien = pLinien;
    this.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
}

編集1:追加した境界線は、JPanelへのコンポーネントの追加方法を制御するためのものです。 1つのJPanelで描画したいが、図面の周囲に境界線がある場合は、このJPanelを、境界線を持つ保留JPanelである別のJPanelに配置することを検討してください。たとえば、

class GoTest {
   private static final int JB_WIDTH = 400;
   private static final int JB_HEIGHT = JB_WIDTH;

   private static void initGui() {
      JFrame frame = new JFrame("GoBoard");
      GoBoard jboard = new GoBoard();
      jboard.setLayout(new BorderLayout(10, 10));

      JPanel holdingPanel = new JPanel(new BorderLayout());
      int eb = 20;
      holdingPanel.setBorder(BorderFactory.createEmptyBorder(0, eb, eb, eb));
      holdingPanel.add(jboard, BorderLayout.CENTER);
      frame.add(holdingPanel, BorderLayout.CENTER);
      jboard.setPreferredSize(new Dimension(JB_WIDTH, JB_HEIGHT));

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      //!! frame.setSize(400, 400);
      frame.pack();
      frame.setVisible(true);
   }

// .... etc....
JPanel jPanel = new JPanel();

jPanel.setBorder(BorderFactory.createLineBorder(Color.black));

ここではjPanelだけでなく、任意のJcomponentに境界線を追加できます

20
Naveen Kocherla

空の境界線は透明です。境界線を設定するには、境界線を表示するために、ライン境界線またはその他の表示境界線を指定する必要があります。

質問の編集に基づく:

絵画は境界線を尊重しません。このコード行をテストに追加すると、境界線が表示されます。

    jboard.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
    jboard.add(new JButton("Test"));  //Add this line
    frame.add(jboard);
4
jzd

Swingは、GoBoardに基づいて計算するためのコンポーネントがないため、GoBoardの推奨サイズ、最小サイズ、および最大サイズが何であるかがわからないため、(おそらく間違った)デフォルトを選択します。ここでカスタム描画を行うので、これらのメソッドを実装する必要があります

Dimension getPreferredSize()
Dimension getMinumumSize()
Dimension getMaximumSize()

または逆に、これらのメソッドのセッターを呼び出します。

2
MeBigFatGuy

BorderLayout(int Gap, int Gap)またはGridLayout(int Gap, int Gap, int Gap, int Gap)

paintComponent(...)内でPaint Border()を使用する理由

    Border line, raisedbevel, loweredbevel, title, empty;
    line = BorderFactory.createLineBorder(Color.black);
    raisedbevel = BorderFactory.createRaisedBevelBorder();
    loweredbevel = BorderFactory.createLoweredBevelBorder();
    title = BorderFactory.createTitledBorder("");
    empty = BorderFactory.createEmptyBorder(4, 4, 4, 4);
    Border compound = BorderFactory.createCompoundBorder(empty, xxx);
    Color crl = (Color.blue);
    Border compound1 = BorderFactory.createCompoundBorder(empty, xxx);
1
mKorbel

固定パディングを取得するには、レイアウトを1つのセルでJava.awt.GridBagLayoutに設定します。その後、各セルにパディングを設定できます。次に、そのセルに内部JPanelを挿入し、(必要な場合)適切なJPanelメソッドを内部JPanelに委任できます。

0
Michał Šrajer