Вы можете использовать getDerivedStateFromProps
внутри дочернего компонента, чтобы решить, следует ли обновлять каждый из них.
Вот также некоторые методы, лучшие практики и питфалы.
Я посмотрел бы на вложение JPanels
. Было бы очень легко сделать каждую строку отдельным JPanel
и затем просто стек JPanels
.
Иначе можно использовать GridBagLayout
. Это - то, которое я использую для большего количества управления, куда компоненты помещаются.
Используя GridBagLayout
Вы можете расположение строка путем постепенного увеличения GridBagConstraint
.gridx
и затем сброс GridBagConstraint.gridx = 0
и GridBagConstraint.gridy++
перемещаться в следующую строку.
Я предложил бы третье лицо свободный менеджер по расположению. MigLayout приходит на ум (проверьте форму в качестве примера у основания связанной страницы), или JGoodies FormLayout, который особенно хорош в подобном форме они.
Типичные менеджеры по расположению хороши, но whoefully несоответствующий для частого использования для экранов как они (новый GroupLayout, используемый разработчиком Matisse в Netbeans, не был создан ни для чего). Связанных менеджеров по расположению намного легче использовать и поддержать, по моему скромному мнению.
Если можно использовать внешний код, смотреть на менеджеров по расположению JGoodies.
Лично, я нахожу, что GridBagLayout больше проблемы, чем это стоит - до такой степени, что я записал моим собственным менеджерам по расположению для предотвращения его.
Я лично предпочитаю GroupLayout.
Даже если Вы не используете разработчика GUI, можно использовать расположение вручную, и это довольно просто и просто для работы с тем, если Вы понимаете понятия.
Я определенно использовал бы 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.
TableLayout был бы моим выбором, можно использовать константы, такие как TableLayout. ЗАЛИВКА для автоизменения размеров и указывает пиксельные ширины для фиксированного.
Ваше расположение похоже, оно по существу состоит из "строк". Так лично я был бы:
Лично, я никогда не касаюсь GridBagLayout с отпорным крюком. Возможно, это - просто я, но я нахожу параллельные алгоритмы и машинный код, программирующий легче, чем постигание GridBagLayout...
Я раньше действительно очень не хотел делать разметки колебания, пока Netbeans не выпустил их gui разработчика. Вы видите демонстрацию здесь. http://rghosting.co.cc
Так как 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 ) );
}
Вы можете описать макет в виде таблицы HTML, а затем использовать этот инструмент: http://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy
Для перевода макета в код Java для настройки GridBagLayout.
GridBagLayout является определенно лучшим выбором для этого. И NetBeans Matisse является, вероятно, самым быстрым способом достигнуть этого. Если Вы используете другой IDE, просто копируете и вставляете автоматически сгенерированный код.
Я думаю, та из всех стандартных разметок, 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);
}
}
GridBagLayout
, конечно.
Если форма - просто это, то Вы сделанная потребность больше чем один JPanel
. (Если у Вас есть кнопки, Вам, вероятно, нужен еще один, в зависимости от того, где/как они),
Поле 0 - 4 и 9 будет иметь gridwidth
набор к 4, другие значение по умолчанию (1, но Вы не должны устанавливать его на 1),
'Пробелы' между группами полей могут быть достигнуты через вставки.
(Для этого расположения, по крайней мере), я не предложил бы сторонних менеджеров по расположению. GridBagLayout
не сложно. Просто требуется (определенный из) время для привыкания к нему.
Визуальный Редактор + Eclipse может сделать их для Вас легко. (Я не очень доволен Netbeans и его разработкой колебания. Попробованный это, но никогда не влюблялся. Возможно, я очень увлекаются Eclipse),