Как можно заставить 4 ячейки в строке с одинаковой шириной в Miglayout, когда используется только одна ячейка? - PullRequest
0 голосов
/ 15 января 2019

Я получил панель с динамической шириной. Компоненты, добавленные на панель, должны располагаться слева направо до 4 компонентов (ячеек) на строку, где каждый компонент / ячейка занимают 25% ширины панелей. Если имеется только один компонент, он должен заполнять 25% родительской ширины - оставшиеся 75% (3 ячейки) пространства должны быть пустыми.

Я заставил его работать, используя хак, но я не доволен этой реализацией - использованием ячеек и созданием «пустой» панели для каждой неиспользуемой ячейки. Смотрите фрагмент кода ниже:

MigLayout migLayout = new MigLayout("fillx, insets 0, wrap 4", "", "");
JPanel panel = new JPanel(migLayout);
JLabel label1 = new JLabel("1");
JLabel label2 = new JLabel("2");
JPanel filler1 = new JPanel();
JPanel filler2 = new JPanel();
panel.add(label1, "cell 0 0);
panel.add(label2, "cell 1 0);
panel.add(filler1, "cell 2 0);
panel.add(filler2 , "cell 3 0);

Это дает то, что можно проиллюстрировать, как показано ниже, где внешняя скобка - это внешняя панель, а две внутренние скобки - это метки:

[  [ 1 ]  [ 2 ]                ]

Вместо использования наполнителей я надеялся, что его можно установить с ограничениями, что-то вроде этого:

MigLayout migLayout = new MigLayout("always 4 cells, fillx", "[fill][fill][fill][fill]", "");
JPanel panel = new JPanel(migLayout);
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
panel.add(label1);
panel.add(label2);

Я пробовал различные ограничения макета и добавлял параметры компонента, но они обычно форматируются следующим образом:

[  [ 1 ]         [ 2 ]         ]

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вы можете использовать% в ограничении столбца, и не забудьте добавить '!' чтобы каждый столбец имел фиксированную ширину.

MigLayout migLayout = new MigLayout("wrap 4, fill", "[25%!,fill][25%!,fill][25%!,fill][25%!,fill]");
JPanel panel = new JPanel(migLayout);
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
panel.add(label1, "grow"); // add grow here if you want to fill up the 25%
panel.add(label2, "grow");

также проверьте http://www.miglayout.com/whitepaper.html, все трюки с миграцией в нем

0 голосов
/ 15 января 2019

Я бы пошел с GridLayout . GridLayout разделит вашу панель на ячейки в соответствии с заданными строками / столбцами (проверьте ее конструктор). Тогда каждый компонент будет соответствовать 100% (ширина и высота) для ячейки.

Однако: Если вы установите макет сетки на 1 строку и 4 столбца (ваш случай) и добавите только 1 компонент, макет будет настроен следующим образом: 1 строка и 1 столбец, потому что он выиграл ' т пустое место.

Уловка / Решение: Добавьте пустой компонент точно так же, как мы добавляем пробел в BoxLayout.

private static Component createSpace() {
    return Box.createRigidArea(new Dimension(1, 1));
}

Неудобство: Если вы хотите добавить компонент на панель после его показа, вы должны удалить пробелы, чтобы вам пришлось либо сохранять все пустые компоненты в структуре, либо делать следующее (я всегда это предпочитаю):

gridLayoutPanel.removeAll();
gridLayoutPanel.add(component1);
gridLayoutPanel.add(newComponent); //This was space before
gridLayoutPanel.add(createSpace());
gridLayoutPanel.add(createSpace());
gridLayoutPanel.repaint();
gridLayoutPanel.revalidate();

SSCCE будет ( игнорировать высоту компонентов ):

import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class GridLayoutTest extends JFrame {
    public GridLayoutTest() {
        getContentPane().setLayout(new GridLayout(1, 4));
        JButton component1 = new JButton("Component1");
        JButton component2 = new JButton("Component2");
        JButton component3 = new JButton("Component3");
        add(component1); //25% of the width
        add(component2); //25% of the width
        add(component3); //25% of the width
        add(createSpace()); //25% of the width
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(500, 200);
        setLocationRelativeTo(null);
    }

    private static Component createSpace() {
        return Box.createRigidArea(new Dimension(1, 1));
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new GridLayoutTest().setVisible(true));
    }
}
...