需要有关此基本布局的意见

时间:2013-06-21 08:55:57

标签: java swing layout jframe jpanel

我想这是一个简单的问题......基本上是关于布局考虑因素。所以让我们考虑下面的代码,我明白了:

figure A

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);

}

}

我想要的是:

figure B

我怎么能实现这一目标?我想有几种方法,我在等待各种各样的建议......

1 个答案:

答案 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。这需要一些习惯,但一旦掌握,这是值得的努力。