gpt4 book ai didi

java - 需要对此基本布局的意见

转载 作者:行者123 更新时间:2023-12-01 04:36:47 27 4
gpt4 key购买 nike

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

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

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

最佳答案

实现此目的的一种方法是覆盖 panelCheckBoxesgetPreferredSize() 方法以返回 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变量不能是分配一个新值,这在您的情况下没有问题)。

仅在构造函数中设置 preferredSize 是行不通的,因为 (1) 大小尚不清楚,(2) 调整窗口大小时它可能会发生变化。但是,当 panelC 得到时,您可以在调用 window.setVisible(true); 后使用 setPreferredSize 尺寸:

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

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

如果您只是希望复选框向左对齐(但不一定延伸到整个宽度),更简单的方法是将 panelC 放入 WEST BorderLayout 的容器。假设颜色仅用于调试并且最终所有内容都将是相同的颜色,您将看不到差异。

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

关于java - 需要对此基本布局的意见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17231261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com