ここにSSCCEがあります:
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BoxLayoutTest extends JFrame {
public BoxLayoutTest(){
JPanel main = new JPanel();
main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS));
main.setBackground(Color.red);
this.add(main);
JPanel northPanel = new JPanel();
JPanel middle = new JPanel();
middle.setLayout(new BoxLayout(middle, BoxLayout.X_AXIS));
middle.add(new JButton("FOO"));
middle.add(Box.createHorizontalGlue());
JPanel aPanel = new JPanel();
aPanel.setBackground(Color.black);
JComboBox b = new JComboBox();
//b.setPreferredSize(new Dimension(100,16)); //uncomment this to see the layout I would like to achieve
//b.setMaximumSize(new Dimension(100,16));
//middle.add(b); //uncomment this line
middle.setBackground(Color.green);
northPanel.setBackground(Color.blue);
main.add(northPanel);
main.add(middle);
main.add(Box.createVerticalGlue());
this.setSize(800,600);
this.setResizable(true);
this.setVisible(true);
}
public static void main(String[] args) {
new BoxLayoutTest();
}
}
コンポーネントで setXXXSize メソッドを使用することが間違っていることを知らなかったときに、以前に書いたいくつかのクラスをリファクタリングしようとしています。サイズ変更可能なフレームを使用して、達成したい結果は次のとおりです。
- northPanel は上部にとどまり、フレーム サイズの変更に応じてサイズを変更する必要があります (正常に動作するようです)。
- JButton を配置する緑色のパネルは、JButton の最大サイズを維持し、上の青色のパネルのすぐ下に配置する必要があります (これは、JButton をそのパネル内に配置するだけで問題なく動作します)。
緑のパネル内に JComboBox を配置すると、問題が発生します (SSCCE の行のコメントを外してみてください)。JComboBox には最大サイズが指定されていないので、フレームに合わせて伸びます。私のコードの以前の間違ったバージョンでは、JComboBox で setxxxSize メソッドを使用してサイズを制限していました (setXXXSize メソッドの行のコメントを外して確認してください)。
私の質問は次のとおりです。
- setXXXSize() メソッドを呼び出さずに BoxLayout を使用して同じ結果を達成することは可能ですか?
- はいの場合、どのように?
- その効果を得るために使用できる他の LayoutManager はありますか?
私を正しい方向に向けてください