Переменное расположение в Swing

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

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

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

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

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

11
задан thepandaatemyface 4 July 2010 в 13:10
поделиться

5 ответов

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();
            }
        });
    }
}
14
ответ дан 3 December 2019 в 04:51
поделиться

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

3
ответ дан 3 December 2019 в 04:51
поделиться

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

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

3
ответ дан 3 December 2019 в 04:51
поделиться

Да, MiGLayout хорош. С ним можно делать все, что угодно.

2
ответ дан 3 December 2019 в 04:51
поделиться

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

1
ответ дан 3 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: