我想这是一个简单的问题......基本上是关于布局考虑因素。所以让我们考虑下面的代码,我明白了:
。
public class TestCode_Web {
public static void main(String[] args) {
JFrame window = new JFrame("Test");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(200, 300);
// Inner panel ---------------------------------------------------------
JPanel innerPanel = new JPanel(new BorderLayout());
innerPanel.setBackground(new Color(250, 250, 200));
window.add(innerPanel);
// Northern panel ------------------------------------------------------
JPanel panelN = new JPanel(new BorderLayout());
JLabel labelN = new JLabel("Label");
panelN.add(labelN, BorderLayout.WEST);
panelN.setBackground(new Color(200, 250, 250));
innerPanel.add(panelN, BorderLayout.NORTH);
// Center panel --------------------------------------------------------
JPanel panelC = new JPanel();
panelC.setBackground(new Color(250, 200, 250));
JPanel panelCheckBoxes = new JPanel(new GridLayout(0, 1));
final JCheckBox c1 = new JCheckBox("C1");
final JCheckBox c2 = new JCheckBox("C2");
final JCheckBox c3 = new JCheckBox("C3");
panelCheckBoxes.add(c1);
panelCheckBoxes.add(c2);
panelCheckBoxes.add(c3);
int width = panelCheckBoxes.getPreferredSize().width;
int height = panelCheckBoxes.getPreferredSize().height;
panelCheckBoxes.setPreferredSize(new Dimension(width, height));
panelC.add(panelCheckBoxes);
innerPanel.add(panelC, BorderLayout.CENTER);
// Southern panel --------------------------------------------------------
JPanel panelS = new JPanel(new BorderLayout());
JLabel labelS = new JLabel(String.valueOf(width) + "/" + String.valueOf(height));
panelS.add(labelS, BorderLayout.WEST);
panelS.setBackground(new Color(250, 250, 200));
innerPanel.add(panelS, BorderLayout.SOUTH);
// ...
window.setVisible(true);
}
}
我想要的是:
我怎么能实现这一目标?我想有几种方法,我在等待各种各样的建议......
答案 0 :(得分:0)
执行此操作的一种方法是覆盖getPreferredSize()
的{{1}}方法,以返回panelCheckBoxes
的宽度。这样,panelC
'尺寸将自动适应panelCheckBoxes
的宽度。
panelC
为了访问匿名内部类中的final JPanel panelC = new JPanel();
// [...]
JPanel panelCheckBoxes = new JPanel(new GridLayout(0, 1)) {
public Dimension getPreferredSize() {
return new Dimension(panelC.getWidth(),
super.getPreferredSize().height);
}
};
,它必须是panelC
(即,在初始化之后,final
变量不能被赋予新值,这是没有问题的在你的情况下)。
只是在构造函数中设置panelC
将不起作用,因为(1)大小尚未知晓,(2)它可能会在调整窗口大小时发生变化。但是,当preferredSize
获得大小时,您可以在调用setPreferredSize
后使用window.setVisible(true);
:
panelC
但请注意,在调整窗口大小时,// after window.setVisible(true);
panelCheckBoxes.setPreferredSize(new Dimension(panelC.getWidth(),
panelCheckBoxes.getHeight()));
这种方式仍然无法调整大小。
如果您只是希望复选框与左侧对齐(但不一定要在整个宽度上拉伸),更简单的方法是将panelCheckBoxes
放入panelC
WEST
容器中1}}。假设颜色仅用于调试,最后所有颜色都是相同的颜色,你就不会看到差异。
最后,对于更复杂的布局,您可能需要查看GridBadLayout。这需要一些习惯,但一旦掌握,这是值得的努力。