MIGLayout - добавление JSeparator - PullRequest
0 голосов
/ 12 июня 2018

Я борюсь с 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);
    }
}

Вот как это выглядит:

enter image description here

и вот как я хочу, чтобы это выглядело так:

enter image description here

Как лучше всего решить эту проблему?Количество текстовых полей будет меняться динамически.Заранее спасибо.

1 Ответ

0 голосов
/ 03 августа 2018

Используйте ограничение макета под названием fill и сделайте все growx.Затем добавьте spanx к последнему компоненту в каждой строке.

Причина, по которой ваш пример выглядел странно, заключалась в том, что вы использовали pushx over 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());
    }
}
...