我有一个使用 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();
}
}
如果放大窗口,中间的组合框也会放大;正如所写,它们下方的垂直胶片也会放大,但不会占用所有可用空间。看来它所获得的空间与它们每个人一样多。
那么解决这个问题的好方法是什么?