Normalerweise könnte man dafür eine JTable verwenden. Oder ein GridBagLayout, wenn alle Steuerelemente in einem übergeordneten Container wären.
Aber wenn die Logik für jedes Objekt komplexer ist und zusätzliche Logik (Prüfungen und Variablen) erfordert, scheint es besser, ein benutzerdefiniertes Panel für jedes Objekt zu verwenden (wie eine Klasse, die JPanel mit Komponenten für jede Mitgliedsvariable erweitert).
Aber wenn LayoutManagers innerhalb dieses benutzerdefinierten Panels verwendet werden, wie BorderLayout, BoxLayout usw., die Komponentengrößen innerhalb des Panels können von denen in der nächsten Zeile abweichen.
Hier ist ein SSCC-Beispiel, wie ich es verwenden möchte und wie es eigentlich aussehen sollte:
Code: Select all
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);
}
}
Mit anderen Worten: Behalten Sie die Fähigkeit von GridBagLayout (oder jedem anderen LayoutManager) bei, räumliche Anforderungen anzupassen und gleichzeitig das Aussehen eines Tabellenlayouts über Unterkomponenten hinweg beizubehalten.
Und wenn ich in das Layout eingreifen müsste Wenn ich direkt alle getPreferredSize()s für jede vertikale Komponente überprüfen/anpassen würde, was wäre der beste Weg, mich in das Layout von Swing einzubinden? doLayout? invalidate()?
Zusätzliche Aspekte:
- Ich möchte die Verwendung von Dialog-Popups zum Konfigurieren jeder Entität vermeiden; Der Benutzer sollte in der Lage sein, sie gleichzeitig zu bearbeiten.
- Ich glaube, dass JTable zu viele Mängel hinsichtlich der spezifischen Anzeige/Verarbeitung von Spalten aufweist (da seine TableCellRenderers anscheinend über die Eigenschaftsklasse und nicht über den Spaltenindex ausgewählt werden), außerdem ist der Zellzugriff auf Entitätsebene schwierig.
Mobile version