11

次のGridBagLayoutコードでは、JFrameのサイズを変更して小さくするときに、指定されたJButtonbtn2の最小サイズが尊重されることを期待しています。しかし、JFrameを小さくすると、btn2は最小サイズよりも小さくなり、その後消えます。

誰かが私が間違っていることの正しい方向に私を向けることができますか?ボタンを含むJPanelの最小サイズを設定する必要があるかもしれませんか?

どんな助けでもありがたいです、ありがとう!

    JFrame frame = new JFrame();
    frame.setSize(400,300);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel();
    panel.setMinimumSize(new Dimension(400,300));
    panel.setBackground(Color.RED);

    panel.setLayout(new GridBagLayout());
    GridBagConstraints gbc = null;

    JButton btn1 = new JButton("btn1");
    btn1.setPreferredSize(new Dimension(150,50));
    btn1.setMinimumSize(new Dimension(150,50));
    gbc = new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, 
            GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
            new Insets(0,0,0,0), 0, 0);
    panel.add(btn1, gbc);

    JButton btn2 = new JButton("btn2");
    btn2.setPreferredSize(new Dimension(150,150));
    btn2.setMinimumSize(new Dimension(150,150));
    gbc = new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, 
            GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
            new Insets(0,0,100,100), 0, 0);
    panel.add(btn2, gbc);

    frame.getContentPane().add(panel);
    frame.setVisible(true);
4

2 に答える 2

8

アンドリュー・トンプソンの答えに加えて:

  • コンポーネントの優先サイズが尊重される可能性があり、尊重される場合、GBLはコンポーネントに設定された最小サイズを尊重しません。
  • GBLは、コンポーネントの優先サイズを尊重できない場合、コンポーネントに設定された最小サイズを尊重します。つまり、コンポーネントはサイズ(w、h)を優先しますが、スペースが不足しているため、これは不可能であるとGBLは判断します。アドバタイズされたコンポーネントの最小サイズにフォールバックします。

したがって、収容フレームを小型化したときに、コンポーネントが以前よりも突然大きくなる可能性が非常に高くなります。希望するサイズよりも大きい最小サイズを設定するだけです。つまり、フレームを小さくすると、突然コンポーネントが大きくなります。それは...奇妙ですが可能です:)すべてがGBLを歓迎します。

この動作を実装するパネルの例を次に示します(GBCは元のGridBagConstraintsよりも使いやすいクラスです)。

private static JPanel getPanel() {

    JPanel panel = new JPanel(new GridBagLayout());

    final JTextField textField = new JTextField("test");
    final String text = "text";
    final JLabel label = new JLabel(text);
    final JButton button = new JButton(new AbstractAction("Enlarge label!") {
        private String actText = text; 
        @Override
        public void actionPerformed(ActionEvent arg0) {
            actText = actText + text;
            label.setText(actText);
        }
    });

    GBC g;

    g = new GBC().locate(0, 0).weight(0.0, 0.0).align(GBC.WEST, GBC.HORIZONTAL, null);
    textField.setMinimumSize(new Dimension(200,20));
    panel.add(textField, g);

    g = new GBC().locate(1, 0).weight(1.0, 0.0);
    panel.add(label, g);

    g = new GBC().locate(0, 1).weight(1.0, 1.0).span(2, 1);
    panel.add(button, g);


    return panel;
}

一般的に、GBL内でサイズを固定する必要のあるコンポーネントは使用しないと思います。異なるレイアウトマネージャーを使用して、他のパネル内にラップします。

本当にGBL内で固定サイズのコンポーネントを使用したい場合は、そのgetPreferredSize()メソッドをオーバーライドして、必要なサイズを返します。しかし、私はこれらの方法を無視することを好みます。

于 2013-04-30T11:23:12.550 に答える
4

ボタンを含むJPanelの最小サイズを設定する必要があるかもしれませんか?

AFAIR GBLは、サイズ設定のヒントを無視することで有名でした。いいえ、その修正です。GBL内のコンポーネントの適切なサイズ変更を取得するにはGridBagConstraints、適切な値でを使用します。ただし、最小サイズ未満に強制されるコンポーネントを表示しないレイアウトの動作に注意してください。

pack()次に、フレームに最小サイズを設定します。最後の行をに変更すると、次のようになります。

frame.pack();
frame.setVisible(true);
frame.setMinimumSize(frame.getSize());

ただし、レイアウトを考えると、パネルののに入れbtn1てから、別のBLののに追加する傾向があります。 外側のBLの中に入るでしょう。PAGE_STARTBorderLayoutLINE_STARTbtn2CENTER

于 2012-08-21T03:36:57.100 に答える