Обычно для этого можно использовать JTable. Или GridBagLayout, если все элементы управления находились в одном родительском контейнере.
Но если логика для каждого объекта более сложна и требует дополнительной логики (проверки и переменные), кажется, лучше использовать пользовательскую панель для каждого объекта (например, класс, расширяющий JPanel с компонентами для каждой переменной-члена).
Но при использовании LayoutManager внутри этой пользовательской панели, например BorderLayout, BoxLayout и т. д. размеры компонентов внутри панели могут отличаться от размеров в следующей строке.
Вот пример SSCC того, как я хочу его использовать и как он должен выглядеть на самом деле:
Код: Выделить всё
package stackoverflow;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ComponentTableLayoutTest {
static public final int TEXT_FIELD_COLS = 30;
static class MyPanel extends JPanel {
private static final long serialVersionUID = 7290890689192066726L;
public final JLabel label;
public final JTextField text = new JTextField(TEXT_FIELD_COLS);
// more elements, complex logic
public MyPanel(final String pLabel) {
label = new JLabel(pLabel);
setLayout(new BorderLayout());
add(label, BorderLayout.WEST);
add(text, BorderLayout.CENTER);
}
}
public static void main(final String... args) {
showInterestingFrame();
showPerfectFrame();
}
private static void showInterestingFrame() { // how I want to use it
final JFrame f = new JFrame();
f.setTitle("component wise table layout test - how it should work");
f.setLayout(new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS));
final MyPanel panel1 = new MyPanel("short: ");
final MyPanel panel2 = new MyPanel("mediummmm: ");
final MyPanel panel3 = new MyPanel("veryverylonglonglong: ");
f.add(panel1);
f.add(panel2);
f.add(panel3);
f.setVisible(true);
f.pack();
f.setLocation(200, 200);
}
private static void showPerfectFrame() { // what it should look like
final JFrame f = new JFrame();
f.setTitle("classic GBL - how it should look");
f.setLayout(new GridBagLayout());
final GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.WEST;
f.add(new JLabel("short: "), gbc);
f.add(new JTextField(TEXT_FIELD_COLS), gbc);
gbc.gridy = 1;
f.add(new JLabel("mediummmm: "), gbc);
f.add(new JTextField(TEXT_FIELD_COLS), gbc);
gbc.gridy = 2;
f.add(new JLabel("veryverylonglonglong: "), gbc);
f.add(new JTextField(TEXT_FIELD_COLS), gbc);
f.setVisible(true);
f.pack();
f.setLocation(200, 300);
}
}
Другими словами: сохраняйте способность GridBagLayout (или любого другого LayoutManager) корректировать пространственные требования, сохраняя при этом внешний вид макета таблицы для всех подкомпонентов.
И если я пришлось напрямую вмешиваться в макетирование, если бы я проверил/настроил все getPreferredSize() для каждого вертикального компонента, как лучше всего было бы подключиться к макету Swing? doLayout? validate()?
Дополнительные аспекты:
- Я хочу избежать использования всплывающих диалоговых окон для настройки каждого объекта; Пользователь должен иметь возможность редактировать их одновременно
- Я считаю, что JTable имеет слишком много недостатков в отношении конкретного отображения/обработки столбцов (поскольку его TableCellRenderer, похоже, выбирается через класс свойства, а не индекс столбца), плюс доступ к ячейке трудно осуществить на уровне сущности.
Подробнее здесь: https://stackoverflow.com/questions/798 ... components
Мобильная версия