Zunächst wird die Tabelle eingerichtet (z. B. werden Spalten hinzugefügt), dann wird sie gefüllt (oder neu gefüllt).
Der Sortierer ist jedoch eine Ausnahme. Obwohl es ein Teil der Setup -Logik zu sein scheint, wird es bei jeder Nachfüllung zurückgesetzt. Bevor eine neue Sorter -Instanz festgelegt ist, wird sie mit Comparator in der Sammlung der Tabelle gespeichert. Ich bin jedoch auf ein Problem gestoßen: Wenn Sie einem TablerOwnersorter vergleichende addieren, überprüft der letztere mit einem Tablemodel (nicht tableColumnModel ), wenn es über einen solchen Spaltenindex verfügt. Wenn nicht, wirkt es aus. Mit anderen Worten, die Daten sind flüssig, sie können nicht nur einmal beim Setup festgelegt werden. Es würde den Typ der Spalte überprüfen und einen passenden Komparator auf den Zeilensortierer der Tabelle automatisch festlegen (unsere Spalten sind leider nicht parametrisiert, haben aber magische Konstanten für Typen). Ich habe versucht, sowohl Spalte als auch Datenmodelle neue Spalten hinzuzufügen (siehe javax.swing.table.Defaulttablemodel#addColumn (java.lang.object) ), um die beiden synchronisiert zu halten. Das Manipulieren eines Tablemodells führt jedoch zum Löschen zuvor festgelegter Vergleicher (siehe javax.swing.defaultrownersorter#alchanged ). Das Gleiche passiert, wenn ich einfach die Spaltenzahl des Datenmodells für jede hinzugefügte Spalte aktualisiere. Bei Bedarf werde ich auch ein MRE dazu einbeziehen. Leider scheint es nicht so einfach zu sein, wie ich es mir erhofft hatte: Meine Idee war es, Javax zu überschreiben. In einer Tabelle (z. B. kann der Benutzer eine zusätzliche Spalte in der GUI hinzufügen). Die App kennt möglicherweise nicht die Gesamtzahl der Spalten, geschweige denn deren Bezeichner, bevor der Benutzer mit der Interaktion beginnt. Dies ist ein weiterer Grund, warum es vor seiner ersten Füllung nicht machbar erscheint, einen Tablemodel vollständig zu initialisieren (z. B. seine Spaltenzahl). Das müsste ich bei jeder Nachfüllung Komparatoren zurücksetzen. Oder gibt es eine Möglichkeit, es nur einmal beim Setup zu tun, wie ich denke, dass es sein sollte?
Code: Select all
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class SortedTableDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("JTable Example");
frame.setContentPane(createMainPanel());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static JPanel createMainPanel() {
JPanel panel = new JPanel(new BorderLayout());
panel.add(createTableScroller());
return panel;
}
private static JScrollPane createTableScroller() {
JTable table = createTable();
return new JScrollPane(table);
}
private static JTable createTable() {
JTable table = new JTable();
table.setAutoCreateColumnsFromModel(false);
TableColumnModel columnModel = table.getColumnModel();
createColumns().forEach(columnModel::addColumn);
RowSorter