Swing中的变量布局

the*_*ace 11 java layout swing

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

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

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

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

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

tra*_*god 14

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

图片

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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1 - 虽然我怀疑这可能也是"GroupLayout"的一个很好的例子,无需设置标签的大小. (2认同)