这是一个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 的最大尺寸,并保持在上方蓝色面板的下方(如果我只将 JButtons 放在该面板内,则效果很好)。
如果我将 JComboBox 放在绿色面板内(尝试取消注释 SSCCE 中的行),就会出现问题。我猜 JComboBox 没有指定最大尺寸,所以它会随着框架延伸。在我的代码的先前错误版本中,我在 JComboBox 上使用 setxxxSize 方法来限制它的尺寸(尝试取消注释 setXXXSize 方法上的行以查看它)。
我的问题是:
- 是否可以在不调用 setXXXSize() 方法的情况下使用 BoxLayout 实现相同的结果?
- 如果是,如何?
- 我可以使用任何其他 LayoutManager 来获得这种效果吗?
请把我放在正确的方向