【发布时间】:2012-03-02 16:42:01
【问题描述】:
我有一个使用 BorderLayout 的中型 UI;中心是一个选项卡式窗格,包含具有各种布局等的各种面板。
我希望此边框布局中心的面板根据 窗口,但我不希望面板中的组件拉伸。标签、组合框、文本字段、按钮——我希望它们保持首选大小,并允许包含它们的面板伸展。我将它们放在滚动窗格中,以防面板空间太小。
各种带有彩色词汇的海报警告在组件上使用任何 setXXXsize() 方法的危险。这就是我现在所做的,我想学习如何避免它。
GridBagLayout 不适用于我的某些面板。它本质上是围绕行和列定向的,并不是所有的东西都适合行和列。当然,我可以创建人工行和列来适应所有内容,但我真的希望 Swing 有更多的布局选项。
Vertical Glue 也不行。我已将它包含在 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();
}
}
如果放大窗口,中心的组合框会放大;如前所述,它们下方的垂直胶块也会扩大,但不会占用所有可用空间。看起来它被赋予了和它们一样多的空间。
那么有什么好的方法来解决这个问题?
【问题讨论】:
-
"..beloved SSCE:" 我也喜欢它。它是 SSCCE (2 Cs)。 ;)
-
不能只是一个独立的小例子吗?
-
“它不能只是一个独立的小例子吗?” Quoting我最喜欢的人之一:“在这个文档中,正确(或可编译,特别是与计算机源代码有关)意味着确保您的示例符合公认的标准和协议。” 最值得注意的子点 “确保您的示例正确。示例编译干净,或者导致您需要帮助的确切错误消息。” 代码编译并显示问题,很容易完成。它是一个SSCCE。 :)
-
我想我认为可编译是自包含的,假设执行是示例的一部分,但我很高兴使用稍长的缩写。如果我们能在结尾处找到另一个“E”字,那么我们可以一直使用双字母......
-
哦,有些人已经够生气了,我用了 5 个字母来表示这个词。它需要所有类型。 ;)
标签: java swing border-layout