Die Frage ist, wie Swing Hörer behandelt. In diesem Beispiel steht die TableModelListener
im Fokus.Wie werden Listener in Java Swing behandelt?
Das Tischmodell (nennen wir es TableModelImpl
) Ich habe von AbstractTableModel
erweitert. Zwischen diesem Tischmodell und der JTable
habe ich die Klasse TableSorter
, die wie ein Dekorator zu TableModelImpl
ist (und die TableSorter
erweitert auch AbstractTableModel
). Die TableSorter
ist über die Assoziation mit TableModelImpl
verbunden, was ich meine ist, dass TableSorter
einen Verweis auf die TableModelImpl
enthält. Ferner haben die TableSorter
Mitglieder des Typs TableModelListener
, die auf mein TableModelImpl
Objekt hören. Die JTable
hört wiederum eine TableSorter
.
Also im Allgemeinen kann gesagt werden, dass das JTable
Objekt hört TableSorter
, die auf meine TableModelImpl
hört. Die Frage ist also: Wie funktioniert das? Angenommen zum Beispiel, dass ich TableModelStructureChanged()
auf meinem TableModelImpl
Objekt aufrufen möchte, wird dieses Event dann an die JTable
über die TableSorter
weitergeleitet?
So etwas verkürzt Beispiel:
public class TableModelImpl extends AbstractTableModel {
private boolean enabled;
public TableModelImpl(//non relevant parameter, linked to data) {
//Irrelevant code binds model to the data
this.enabled = false;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
fireTableStructureChanged();
}
// More irrelevant code
}
public class TableSorter extends AbstractTableModel {
private TableModel tableModel;
private MouseListener mouseListener;
private TableModelListener tableModelListener;
public TableSorter() {
this.mouseListener = new MouseHandler();
this.tableModelListener = new TableModelHandler();
}
public TableSorter(TableModel tableModel) {
this();
setTableModel(tableModel); //Adds this.tableModelListener to tableModels listenerList
}
}
Also, wenn ich folgendes tun:
TableModelImpl tm = new TableModelImpl();
TableSorter sorter = new TableSorter(tm);
JTable table = new JTable(sorter);
tm.setEnabled(true);
Wird die JTable benachrichtigt?
Beschreiben Sie Ihren Code nicht, zeigen Sie ihn. – RealSkeptic
@RealSkeptic Ok Ich habe ein Beispiel hinzugefügt. Der echte Code ist ziemlich lang, also habe ich versucht, die relevanten Teile einzubeziehen. Der TableSorter enthält auch Parameter und Code für die Sortierung, der nicht mit Listenern zusammenhängt. Außerdem gibt es Bindungen an das Datenmodell, die sich nicht auf Listener beziehen. – patrik
Es ist schwer zu sagen, da wir keinen Zugriff auf Ihren 'TableModelHandler' oder' setTableModel' haben. Aus der Sicht der Dinge, 'TableSorter' will als Proxy zwischen' JTable' und 'TableModelImp' agieren, so dass alle Ereignisse, die von' TableModelImpl' ausgelöst werden, (möglicherweise modifiziert und) an alle mit '' registrierten Listener weitergeleitet werden müssen Tisch Sorter'. 'JTable' registriert sich selbst als' TableModeListener' zu welchem Modell Sie es auch anbieten, also vorausgesetzt, Sie haben die Ereignisweiterleitung richtig eingerichtet, dann sollte es funktionieren – MadProgrammer