MIGLayout - 添加JSeparator

时间:2018-06-12 17:35:07

标签: java swing layout-manager miglayout jseparator

我正在与MIGLayout斗争 - 我一般都知道它的基础知识,但今天遇到了问题。

简化情况:

我想要有三行,这样在第一行和第三行中有一个非固定数量的对象(e.x。JTextField组件)。第一行的第一个文本字段的宽度应与第三行的第一个文本字段的宽度相同,依此类推。

行中的最后一个文本字段(包含大部分字段)应该会增加其余的帧大小。

这两行应该用JSeparator区分,它也应该是帧的长度。

我已经看过How to draw a separator across a panel using MigLayout,但由于我需要将字段完全对齐,所以它对我来说不起作用。

这是我的代码:

public class Main extends JFrame {
    public static void main(String[] args) {
            JFrame.setDefaultLookAndFeelDecorated(true);
            new Main();
    }

    public Main() {
            setLayout(new MigLayout(new LC()));
            setPreferredSize(new Dimension(800, 300));
            CC cc = new CC().growX();
            CC wcc = new CC().growX().wrap();
            add(new JTextField("Area 1"), cc);
            add(new JTextField("Area 2"), cc);
            add(new JTextField("Area 3"), wcc);
            add(new JSeparator(), new CC().spanX().pushX().growX().wrap());
            add(new JTextField("Longer Area 1"), cc);
            add(new JTextField("Longer Area 2"), cc);

            setDefaultCloseOperation(EXIT_ON_CLOSE);
            pack();
            setVisible(true);
    }
}

这就是它的样子:

enter image description here

这就是我想要它的样子:

enter image description here

这个问题的最佳解决方案是什么?文本字段的数量将动态变化。提前谢谢。

1 个答案:

答案 0 :(得分:0)

使用名为fill的布局约束,使所有内容growx。然后将spanx添加到每一行的最后一个组件。

您的示例看起来很奇怪的原因是因为您在pushx上使用fill

以下示例产生此输出。

enter image description here

可运行示例

import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;

import net.miginfocom.swing.MigLayout;

@SuppressWarnings("serial")
public class TextFieldsForEveryone extends JFrame {
    private JPanel panel;

    private TextFieldsForEveryone() {
        setPreferredSize(new Dimension(800, 300));
        setUp();
        add(panel);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    private void setUp() {
        panel = new JPanel(new MigLayout("fillx"));
        panel.add(new JTextField("Area 1"), "growx");
        panel.add(new JTextField("Area 2"), "growx");
        panel.add(new JTextField("Area 3"), "growx, spanx, wrap");
        panel.add(new JSeparator(), "growx, spanx, wrap");
        panel.add(new JTextField("Longer Area 1"), "growx");
        panel.add(new JTextField("Longer Area 2"), "growx, spanx");
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new TextFieldsForEveryone());
    }
}