Переменная макет в Swing

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

Пользователь, например, вводит количество текстовых полей, которые они хотят, и какое из этих текстовых полей сгруппировано в граничных панелях, и программа генерирует это.

Я использую GridLayout, но проблема в том, что он делает все ячейки одинаковой ширины и высоты, что прекрасно, когда все компоненты имеют одинаковый размер, но когда у меня, например, есть текстовое поле и граничный панель с несколькими полями, либо текстовое поле растягивается, либо панель сжимается.

Я хотел бы, чтобы все компоненты имели минимальный размер, но все же, вы знаете, можно использовать.

Пример того, как это происходит сейчас, используя GridLayout, все поля являются нормальными, однострочные JTextFields, где панель с названием даты полностью сжата ( он имеет три поля в нем), а поля первого уровня - большие. У кого-нибудь есть указатели?

Ответ 1

MiGLayout имеет много апелляции, но BoxLayout является альтернативой.

image

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();
            }
        });
    }
}

Ответ 2

Я бы посмотрел на miglayout. Это намного более полезно, чем любой из встроенных менеджеров макетов.

Ответ 3

Ваша общая цель - "используемые размеры компонентов" сталкиваются с "неизвестным номером". Сделайте число достаточно большим, и они не будут соответствовать ни одному экрану.

Перепробовайся, если тебе не будет лучше использовать JTables (ячейки можно сделать редактируемыми) в сочетании с JScrollPanel. Если вы хотите/должны поддерживать ваш подход к созданию компонентов, поместите весь JPanel, который содержит ваши компоненты в JScrollPane, таким образом, компоненты не будут сильно сжаты.

Ответ 4

Да, MiGLayout приятно. Вы можете делать с ним что угодно.

Ответ 5

Минимальный размер в AWT и Swing обычно бессмыслен. Я предлагаю добавить панель для делегирования минимального размера в исходный предпочтительный размер и, возможно, добавить бит в новый предпочтительный размер. В GridBagLayout добавьте веса, где вы хотите, чтобы дополнительное пространство было в нормальном размере. Как упоминает Дюрандал, выскакивающие полосы прокрутки вокруг окна верхнего уровня бьют, сжимают макет или уходят с экрана (я пишу это на нетбуке, поэтому я знаю о окнах больше экрана).