Swing中的变量布局

时间:2010-07-04 13:10:04

标签: java swing layout

当你不知道你将拥有多少组件以及它们有多大时,你会如何获得一个体面的gui?

例如,用户输入他们想要的文本字段数以及这些文本字段中的哪些文本字段按边框面板分组,程序会生成此字段。

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

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

Example of how it is now, using GridLayout,所有字段都是正常的,单行JTextFields,标题为date的面板被完全挤压(它有三个字段),第一级字段是大的。任何人有任何指针?

5 个答案:

答案 0 :(得分:13)

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

image

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();
            }
        });
    }
}

答案 1 :(得分:3)

我会看一下miglayout。它比任何内置布局管理器更有用。

答案 2 :(得分:3)

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

Overthink如果你不能更好地使用JTables(单元格可以编辑)与JScrollPanel结合使用。 如果您希望/必须保持生成组件的方法,请将包含组件的整个JPanel放入JScrollPane中,这样组件就不会被挤得很糟糕。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

AWT和Swing的最小尺寸通常毫无意义。我建议添加一个面板,将最小尺寸委托给原始首选尺寸,并可能添加一些新的首选尺寸。在GridBagLayout中添加权重,您希望以正常大小增加空间。正如Durandal所提到的,在顶层窗口周围弹出滚动条会挤压布局或离开屏幕(我在上网本上写这个,所以我知道窗户大于屏幕)。