Как я могу лучше всего разметить эти компоненты в Swing?

Вы можете использовать getDerivedStateFromProps

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

Вот также некоторые методы, лучшие практики и питфалы.

5
задан John Topley 9 January 2009 в 16:01
поделиться

13 ответов

Я посмотрел бы на вложение JPanels. Было бы очень легко сделать каждую строку отдельным JPanel и затем просто стек JPanels.

Иначе можно использовать GridBagLayout. Это - то, которое я использую для большего количества управления, куда компоненты помещаются.

Используя GridBagLayout Вы можете расположение строка путем постепенного увеличения GridBagConstraint.gridx и затем сброс GridBagConstraint.gridx = 0 и GridBagConstraint.gridy++ перемещаться в следующую строку.

11
ответ дан 18 December 2019 в 08:32
поделиться

Я предложил бы третье лицо свободный менеджер по расположению. MigLayout приходит на ум (проверьте форму в качестве примера у основания связанной страницы), или JGoodies FormLayout, который особенно хорош в подобном форме они.

Типичные менеджеры по расположению хороши, но whoefully несоответствующий для частого использования для экранов как они (новый GroupLayout, используемый разработчиком Matisse в Netbeans, не был создан ни для чего). Связанных менеджеров по расположению намного легче использовать и поддержать, по моему скромному мнению.

4
ответ дан 18 December 2019 в 08:32
поделиться

Если можно использовать внешний код, смотреть на менеджеров по расположению JGoodies.

Лично, я нахожу, что GridBagLayout больше проблемы, чем это стоит - до такой степени, что я записал моим собственным менеджерам по расположению для предотвращения его.

1
ответ дан 18 December 2019 в 08:32
поделиться

Я лично предпочитаю GroupLayout.

Даже если Вы не используете разработчика GUI, можно использовать расположение вручную, и это довольно просто и просто для работы с тем, если Вы понимаете понятия.

1
ответ дан 18 December 2019 в 08:32
поделиться

Я определенно использовал бы DesignGridLayout:

DesignGridLayout layout = new DesignGridLayout(this);
layout.row().grid(label0).add(field0);
layout.emptyRow();
layout.row().grid(label1).add(field1);
layout.row().grid(label2).add(field2);
layout.row().grid(label3).add(field3);
layout.row().grid(label4).add(field4);
layout.emptyRow();
layout.row().grid(label5).add(field5).grid(label6).add(field6);
layout.row().grid(label7).add(field7).grid(label8).add(field8);
layout.emptyRow();
layout.row().grid(label9).add(field9);

Отказ от ответственности: Я - один из авторов DesignGridLayout.

2
ответ дан 18 December 2019 в 08:32
поделиться

TableLayout был бы моим выбором, можно использовать константы, такие как TableLayout. ЗАЛИВКА для автоизменения размеров и указывает пиксельные ширины для фиксированного.

TableLayout

0
ответ дан 18 December 2019 в 08:32
поделиться

Ваше расположение похоже, оно по существу состоит из "строк". Так лично я был бы:

  • Создайте вертикальное Поле с Box.createVerticalBox (); это сложит его компоненты вертикально - в действительности, позволить Вам добавить строки
  • Создайте панель для каждой строки: Я думаю, что Вы могли использовать JPanel с BorderLayout (и маркировка слева, текстовое поле как компонент центра), или снова использовать Box.createHorizontalBox () и добавить маркировку и текстовое поле к этому с соответствующей минутой / предпочтительным размером
  • Можно добавить "распорку" к вертикальному полю, где Вам нужны разделители строки
  • Вашей строке с двумя группами маркировки/поля нужен определенный специальный режим, но это - по существу просто горизонтальное поле с ДВУМЯ из Ваших "строк" в нем.

Лично, я никогда не касаюсь GridBagLayout с отпорным крюком. Возможно, это - просто я, но я нахожу параллельные алгоритмы и машинный код, программирующий легче, чем постигание GridBagLayout...

0
ответ дан 18 December 2019 в 08:32
поделиться

Я раньше действительно очень не хотел делать разметки колебания, пока Netbeans не выпустил их gui разработчика. Вы видите демонстрацию здесь. http://rghosting.co.cc

0
ответ дан 18 December 2019 в 08:32
поделиться

Так как Java SE 6 можно использовать GroupLayout

Это очень легко и смотрит точно так же, как Вы хотите.

Для этого окна:

сопроводительный текст http://img165.imageshack.us/img165/8237/sampleusinggrouplayoutca2.png

У меня есть этот код:

    // Layout the components using the new GroupLayout added
    // in java 1.6.
    // Adding to the main frame
    private void layoutComponents(){
        JPanel panel = new JPanel();

        GroupLayout layout = new GroupLayout(panel);
        panel.setLayout(layout);

        layout.setAutoCreateGaps(true);         
        layout.setAutoCreateContainerGaps(true);

        SequentialGroup hGroup = layout.createSequentialGroup();

        JLabel nameLbl  = new JLabel("Name");
        JLabel countLbl = new JLabel("Amount");
        JLabel dateLbl  = new JLabel("Date(dd/MM/yy)");
        hGroup.addGroup(layout.createParallelGroup().
                addComponent(nameLbl).
                addComponent(countLbl).
                addComponent(dateLbl).
                addComponent(go));

        hGroup.addGroup(layout.createParallelGroup().
                addComponent(name).
                addComponent(count).
                addComponent(date));

        layout.setHorizontalGroup(hGroup);

        SequentialGroup vGroup = layout.createSequentialGroup();

        vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
                addComponent(nameLbl).
                addComponent(name));

        vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
                addComponent(countLbl).
                addComponent(count));

        vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
                addComponent(dateLbl).
                addComponent(date));

        vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
                addComponent(go));
        layout.setVerticalGroup(vGroup);

        frame.add( panel , BorderLayout.NORTH );
        frame.add( new JScrollPane( textArea ) );
    }
0
ответ дан 18 December 2019 в 08:32
поделиться

Вы можете описать макет в виде таблицы HTML, а затем использовать этот инструмент: http://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy

Для перевода макета в код Java для настройки GridBagLayout.

0
ответ дан 18 December 2019 в 08:32
поделиться

GridBagLayout является определенно лучшим выбором для этого. И NetBeans Matisse является, вероятно, самым быстрым способом достигнуть этого. Если Вы используете другой IDE, просто копируете и вставляете автоматически сгенерированный код.

0
ответ дан 18 December 2019 в 08:32
поделиться

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

Вы могли попробовать что-то как следующий пример, где я упростил сложного конструктора GridBagConstraints до того, в чем я действительно нуждаюсь при помощи addToLayout.

Если можно использовать IDE, хотя, это может действительно сделать вещи легче (Matisse в NetBeans, например).

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GridBagLayoutTest extends JPanel {

    public GridBagLayoutTest() {
        setLayout(new GridBagLayout());
        addToLayout(new JLabel(     "Label 0" ), 0, 0, 0d, 1);
        addToLayout(new JTextField( "Field 0" ), 0, 1, 1d, 4);
        addToLayout(new JLabel(     "*"       ), 0, 5, 0d, 1);
        addToLayout(new JPanel()               , 1, 0, 0d, 1);
        addToLayout(new JLabel(     "Label 1" ), 2, 0, 0d, 1);
        addToLayout(new JTextField( "Field 1" ), 2, 1, 1d, 4);
        addToLayout(new JLabel(     "*"       ), 2, 5, 0d, 1);
        addToLayout(new JLabel(     "Label 2" ), 3, 0, 0d, 1);
        addToLayout(new JTextField( "Field 2" ), 3, 1, 1d, 1);
        addToLayout(new JLabel(     "*"       ), 3, 2, 0d, 1);
        addToLayout(new JLabel(     "Label 3" ), 3, 3, 0d, 1);
        addToLayout(new JTextField( "Field 3" ), 3, 4, 1d, 1);
        addToLayout(new JLabel(     "*"       ), 3, 5, 0d, 1);
    }

    private void addToLayout(java.awt.Component comp, int y, int x, double weightx, int gridwidth) {
        add(comp, new GridBagConstraints(x, y, gridwidth, 1, weightx, 0d,
                                         GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                                         new java.awt.Insets(2, 4, 2, 4), 0, 0 ) );
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new GridBagLayoutTest());
        frame.setSize(800, 600);
        frame.setVisible(true);
    }
}
0
ответ дан 18 December 2019 в 08:32
поделиться

GridBagLayout, конечно.

Если форма - просто это, то Вы сделанная потребность больше чем один JPanel. (Если у Вас есть кнопки, Вам, вероятно, нужен еще один, в зависимости от того, где/как они),

Поле 0 - 4 и 9 будет иметь gridwidth набор к 4, другие значение по умолчанию (1, но Вы не должны устанавливать его на 1),

'Пробелы' между группами полей могут быть достигнуты через вставки.

(Для этого расположения, по крайней мере), я не предложил бы сторонних менеджеров по расположению. GridBagLayout не сложно. Просто требуется (определенный из) время для привыкания к нему.

Визуальный Редактор + Eclipse может сделать их для Вас легко. (Я не очень доволен Netbeans и его разработкой колебания. Попробованный это, но никогда не влюблялся. Возможно, я очень увлекаются Eclipse),

0
ответ дан 18 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

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