0

nullレイアウトのJPanelの上に垂直BoxLayoutのJPanelがあります。

BoxLayoutを備えたJPanelは、コンポーネントが追加されるにつれて成長するようにしたいと思います。

このコードを参照してください:

public static void main (String[] args) {
    JFrame f = new JFrame();
    f.setSize(500,500);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel total = new JPanel();
    total.setLayout(null);
    total.setSize(f.getWidth(),f.getHeight());
    total.setBackground(Color.green);
    JPanel box = new JPanel();
    box.setLocation(100,200);
    box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
    box.add(new JButton("test"));
    box.add(new JLabel("hey"));
    total.add(box);
    f.add(total);
    f.setVisible(true);
}

コンポーネントが表示されないことに気付くでしょう。

コンポーネント(垂直方向に追加)を追加するとサイズが動的に増加するように、JPanelの「ボックス」を作成するにはどうすればよいですか。

事前に:「ボックス」の位置を正確に100,200にする必要があるため、nullレイアウトを使用しないことを提案しないでください。nullレイアウトを使用する必要があります。「合計」のヌルレイアウトは、「ボックス」パネルに焦点を当てた私の質問への回答に影響を与えるべきではありません。

4

4 に答える 4

9

レイアウトマネージャーを捨てることによって、あなたは突然その仕事に責任を持つようになります。私が追加するかもしれない仕事、それは簡単ではありません...

基本的に、例を挙げれば、子コンポーネントのサイズを設定できていません...

JFrame f = new JFrame();
f.setSize(500, 500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel total = new JPanel();
total.setLayout(null);
total.setSize(f.getWidth(), f.getHeight());
total.setBackground(Color.green);

JPanel box = new JPanel();
box.setLocation(100, 200);
box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
box.add(new JButton("test"));
box.add(new JLabel("hey"));
box.setSize(100, 100);  // <-- Don't forget this..

total.add(box);
f.add(total);
f.setVisible(true);

個人的には、あなたがトラブルを求めていると思いますが、私は何を知っているでしょうか...

より良いアイデアは、EmptyBorderパディングを提供するためのようなものを使用することかもしれません...

ここに画像の説明を入力してください

JFrame f = new JFrame();
f.setSize(500, 500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel total = new JPanel(new BorderLayout());
total.setSize(f.getWidth(), f.getHeight());
total.setBackground(Color.green);
total.setBorder(new EmptyBorder(100, 200, 100, 200));

JPanel box = new JPanel();
box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
box.add(new JButton("test"));
box.add(new JLabel("hey"));

total.add(box);
f.add(total);
f.setVisible(true);

レイアウトマネージャーの例で更新

これで、すべてのレイアウトマネージャーが失敗した場合は、独自のレイアウトマネージャーを作成してみてください。これには、レイアウトマネージャーに必要なnullメリットと、Swingのコンポーネント変更プロセスに統合するメリットがありますComponentListenersContainerListeners

ここに画像の説明を入力してください

JPanel total = new JPanel();
total.setLayout(new SuperAwesomeBetterThenYoursLayout());

カスタムレイアウトマネージャー

public static class SuperAwesomeBetterThenYoursLayout implements LayoutManager {

    @Override
    public void addLayoutComponent(String name, Component comp) {
    }

    @Override
    public void removeLayoutComponent(Component comp) {
    }

    @Override
    public Dimension preferredLayoutSize(Container parent) {
        return new Dimension(100, 300);
    }

    @Override
    public Dimension minimumLayoutSize(Container parent) {
        return new Dimension(100, 300);
    }

    @Override
    public void layoutContainer(Container parent) {
        boolean laidOut = false;
        for (Component child : parent.getComponents()) {
            if (child.isVisible() && !laidOut) {
                child.setLocation(200, 100);
                child.setSize(child.getPreferredSize());
            } else {
                child.setSize(0, 0);
            }
        }
    }
    
}

これは基本的にあなたがとにかくしなければならない仕事を表していますが、Swingがどのように設計されたかと連動する方法でそれを行います...

于 2013-01-12T05:31:55.100 に答える
6

提案:

  • ほとんどの場合、nullレイアウトを使用しないでください。
  • 合計をあげてみませんJPanelBorderLayout
  • BoxLayout次に、 usingJPanelBorderLayout.NORTH(またはBorderLayout.PAGE_START)の位置に追加します。

編集
あなたの状態、

事前に:「ボックス」の位置を正確に100,200にする必要があるため、nullレイアウトを使用しないことを提案しないでください。nullレイアウトを使用する必要があります。「合計」のヌルレイアウトは、「ボックス」パネルに焦点を当てた私の質問への回答に影響を与えるべきではありません。

あなたはもう一度あなたのプログラムに不必要な制限を課していると思います。「ボックス」を100、200に配置するには、そのサイズの空の境界線をその周りに配置するか、その他の方法で簡単に配置できます。しかし、答えはnullレイアウトの使用を捨てることではありません。

于 2013-01-12T03:46:51.580 に答える
3

すぐに、私が変更するもの:

public static void main (String[] args) {
    JFrame f = new JFrame();
    //f.setSize(500,500);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel total = new JPanel();
    //total.setLayout(null); //<-- this is usually a bad idea, but you can keep it
    //                                if you want to specify an EXACT location
    //                                for your JPanel
    total.setPreferredSize(500, 500);
    total.setBackground(Color.green);
    JPanel box = new JPanel();
    //box.setLocation(100,200);
    box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
    box.add(new JButton("test"));
    box.add(new JLabel("hey"));
    total.add(box);
    f.add(total);
    f.pack();
    f.setVisible(true);
}

その基礎ができたら、JPanelのサイズを動的に変更するために必要なことは次のとおりです。

panel.setSize(width, heightOfComponentWithin * numberOfComponents);
container.repaint(); //<-- Im not sure if you also have to call panel.repaint(),
//                           you probably don't have to.

また、JPanelが見えなくなった場合に備えて、スクロールビューを使用することをお勧めします。幸運を!

于 2013-01-12T05:08:54.877 に答える
2

ボックスJPanelのサイズを設定していないことが原因かもしれません。

于 2013-01-12T04:35:12.987 に答える