0

我正在苦苦挣扎MIGLayout- 我一般都知道它的基础知识,但今天遇到了一个问题。

为了简化情况:

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

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

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

我已经看到了如何使用 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);
    }
}

这是它的样子:

在此处输入图像描述

这就是我希望它的样子:

在此处输入图像描述

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

4

1 回答 1

0

使用名为filland make everything的布局约束growx。然后添加spanx到每一行的最后一个组件。

您的示例看起来很奇怪的原因是您使用pushx了 over fill

以下示例产生此输出。

在此处输入图像描述

可运行示例

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());
    }
}
于 2018-08-03T13:50:41.567 回答