我有一个使用 BorderLayout 的中型 UI;中心是一个选项卡式窗格,包含具有各种布局等的各种面板。
我希望此边框布局中心的面板根据窗口的大小调整大小,但我不希望面板内的组件拉伸。标签、组合框、文本字段、按钮——我希望它们保持自己喜欢的大小,并允许包含它们的面板伸展。我将它们放在滚动窗格中,以防面板空间太小。
各种带有彩色词汇的海报警告不要在组件上使用任何 setXXXsize() 方法的危险。这就是我现在所做的,我想学习如何避免它。
GridBagLayout 不适合我的某些面板。它本质上是围绕行和列定向的,并不是所有的东西都适合行和列。当然,我可以创建人工行和列来适应所有内容,但我真的希望 Swing 有更多的布局选项。
垂直胶水也不这样做。我已将其包含在 HFOE 心爱的 SSCE 中:
package example;
import java.awt.BorderLayout;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class BorderAndBox extends JFrame
{
public static void main(String args[])
{
BorderAndBox bnb = new BorderAndBox();
bnb.createUI();
bnb.setVisible(true);
}
public void createUI()
{
JPanel borderPanel = new JPanel(new BorderLayout());
JLabel northLabel = new JLabel("Nawth");
borderPanel.add(northLabel, BorderLayout.NORTH);
String[] southComboChoices = { "one", "two", "three" };
JComboBox southCombo = new JComboBox(southComboChoices);
borderPanel.add(southCombo, BorderLayout.SOUTH);
JPanel centerPanel = new JPanel();
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS));
String[] firstChoices = { "first", "uno", "UN" };
String[] secondChoices = { "second", "dos", "zwei" };
String[] thirdChoices = { "third", "tres", "drei" };
JComboBox firstCombo = new JComboBox(firstChoices);
JComboBox secondCombo = new JComboBox(secondChoices);
JComboBox thirdCombo = new JComboBox(thirdChoices);
centerPanel.add(firstCombo);
centerPanel.add(secondCombo);
centerPanel.add(thirdCombo);
centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT
// take up available vertical space, instead it appears to create a space
// that is shared equally among the (now) four components of this space.
borderPanel.add(centerPanel, BorderLayout.CENTER);
getContentPane().add(borderPanel);
pack();
}
}
如果放大窗口,中心的组合框会放大;如前所述,它们下方的垂直胶块也会扩大,但不会占用所有可用空间。看起来它被赋予了与它们中的每一个一样多的空间。
那么解决这个问题的好方法是什么?