1

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

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

}

}

我想要的是有这个:

图B

我怎么能做到这一点?我想有几种方法,我正在等待您的各种建议......

4

1 回答 1

0

一种方法是覆盖 返回宽度的getPreferredSize()方法。这样,'大小会自动适应.panelCheckBoxespanelCpanelCheckBoxespanelC

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不能为变量分配新值,这在您的情况下没有问题)。

preferredSize在构造函数中设置该点是行不通的,因为 (1) 大小尚不清楚,并且 (2) 调整窗口大小时它可能会改变。但是,您可以在调用setPreferredSize 之后window.setVisible(true);使用,当panelC获得大小时:

// after window.setVisible(true);
panelCheckBoxes.setPreferredSize(new Dimension(panelC.getWidth(), 
                                               panelCheckBoxes.getHeight()));

但是,请注意,panelCheckBoxes当您调整窗口大小时,这种方式仍然不会调整大小。

如果您只希望复选框向左对齐(但不一定延伸到整个宽度),一种更简单的方法panelCWESTBorderLayout. 假设颜色仅用于调试,并且最终一切都将是相同的颜色,您不会看到差异。

最后,对于更复杂的布局,您可能需要查看GridBadLayout。这需要一些时间来适应,但一旦掌握了,就值得付出努力。

于 2013-06-21T11:46:50.430 回答