Swing中的可变布局

当你不知道你会有多less组件,他们会有多大,你会如何获得一个像样的GUI?

例如,用户input他们想要的文本字段的数量,以及哪些文本字段被分组在有边框的面板中,程序生成这个文本字段。

我一直在使用GridLayout,但问题是,它使所有单元格具有相同的宽度和高度,当所有组件都具有相同的大小,这是很好的,但是当我,例如,有一个文本字段和带有多个有边框的面板字段,或者文本字段被拉伸或面板被挤压。

我希望所有组件都具有最小的尺寸,但是您仍然可以使用。

现在是如何使用GridLayout的例子 ,所有字段都是正常的,单行的JTextFields,其中标题为date的面板被完全挤压(它有三个字段),第一级字段是通向大的。 任何人有任何指针?

MiGLayout有很多吸引力,但是BoxLayout是另一种select。

图片

 import java.awt.*; import java.util.List; import java.util.ArrayList; import javax.swing.*; public class BoxTest extends JPanel { private List<JTextField> fields = new ArrayList<JTextField>(); public BoxTest() { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); this.add(createPane(3, "One ", Color.red)); this.add(createPane(3, "Two ", Color.green)); this.add(createPane(10, "Three ", Color.blue)); } private JPanel createPane(int n, String s, Color c) { JPanel outer = new JPanel(); outer.setLayout(new BoxLayout(outer, BoxLayout.Y_AXIS)); outer.setBorder(BorderFactory.createLineBorder(c, 2)); for (int i = 0; i < n; i++) { JPanel inner = new JPanel(); inner.setLayout(new BoxLayout(inner, BoxLayout.X_AXIS)); JLabel label = new JLabel(s + i + ":", JLabel.RIGHT); label.setPreferredSize(new Dimension(80, 32)); inner.add(label); JTextField tf = new JTextField("Stackoverflow!", 32); inner.add(tf); fields.add(tf); outer.add(inner); } return outer; } private void display() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JScrollPane jsp = new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); this.validate(); Dimension d = this.getPreferredSize(); d.height /= 2; jsp.getViewport().setPreferredSize(d); jsp.getVerticalScrollBar().setUnitIncrement( this.getPreferredSize().height / fields.size()); f.add(jsp); f.pack(); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new BoxTest().display(); } }); } } 

我会看看miglayout。 这比任何内置的布局pipe理器更有用。

您的总体目标 – “可用组件大小”与“未知数”冲突。 使数字足够大,他们将不适合任何屏幕。

如果使用JTables(单元格可以编辑)与JScrollPanel相结合,那么就不要使用Overthink。 如果你想/必须保持你的方法来生成组件,把包含你的组件的整个JPanel放到一个JScrollPane中,这样组件就不会被挤坏。

是的, MiGLayout很好。 你可以用它做任何事情。

AWT和Swing中的最小尺寸通常毫无意义。 我build议添加一个面板委托最小大小为原来的首选大小,并可能添加一点到新的首选大小。 在GridBagLayout添加权重,你想要额外的空间去正常的大小。 正如Durandal提到的那样,在顶层窗口周围popup滚动条会挤压布局或者离开屏幕(我在Netbook上写这个,所以我知道窗口大于屏幕)。