2012-04-03 8 views
3

Ich habe eine benutzerdefinierte AbstractTableModel gemacht. Der Konstruktor initialisiert das Modell mit Daten aus einer Datei. Ich möchte jedoch dem Modell eine zusätzliche Spalte hinzufügen (dies liegt an SQL-Einschränkungen in seinen Spalten).Java: wie FireTableStructureChanged ein AbstractTableModel ändern?

Ich versuche dies zu erreichen, indem ich zu dem Initialisierungscode einen Aufruf einer Methode addColumn (String columnName, Vector columnData) hinzufüge.

Diese addColumn-Methode in meinem benutzerdefinierten AbstractTableModel wird direkt von der AddColumn-Methode von DefaultTableModel abgeleitet, einschließlich "fireTableStructureChanged()".

Doch wenn ich diesen Code ausführen, scheint FireTableStructureChanged() meine neue Spalte nicht hinzuzufügen und die JTable zeigt nur mit Daten aus der Datei. Warum könnte das sein?

Hier ist ein kurzer Hinweis auf den Code ich verwende:

public class Dummy extends AbstractTableModel { 
    public Dummy() { 
     //load data from SQL file into ResultSets 
     //transfer ResultSet.metadata into columnHeaders Vector<String> 
     //transfer ResultSet.data into columnDatums Vector<String> 
     fireTableChanged(null); 
     addColumn("Added Heading", (Vector)null); 
    } 

    public addColumn(String columnHeader, Vector columnData) { 
     columnHeaders.add(columnHeader); 
     // transfer columnData into columnDatums 
     fireTableStructureChanged(); 
    } 
} 

Ist es ein Zuhörer Problem - wird zu diesem Zeitpunkt fireTableStructureChanged nichts hören()?

+0

Bitte lernen Java Namenskonventionen und bleiben Sie dabei – kleopatra

+0

@kleopatra - danke, aber ich kenne sie. dummy ist nicht mehr als ein Wegwerf-Klassenname für Stackoverflow-Zwecke! – Arvanem

+0

Es tut den Augen potenzieller Helfer weh :-) Was kann nicht sein, was du willst ... – kleopatra

Antwort

4

Sie werden Ihre Implementierung der drei erforderlich (d unimplemented) Methoden spezifiziert durch die TableModel Schnittstelle in AbstractTableModel offenbaren müssen. Insbesondere müssen getColumnCount() und getRowCount() die aktualisierten Werte zurückgeben. Die Methoden fireXxx() weisen die Ansicht einfach an, das Modell über getValueAt() abzufragen. Die Daten müssen dort warten um getValueAt() abzurufen. EnvTableTest ist ein einfaches Beispiel. Betrachten Sie auch eine modernere Alternative zu Vector, die möglicherweise nicht benötigten Synchronisierungscode enthält.

+0

+1 für Ihre durchdachte und eingehende Antwort. Ich werde die Methoden überprüfen und versuchen, das Problem so zu lösen, wie Sie es vorschlagen. Wenn es funktioniert, akzeptiere ich deine Antwort. Wenn ich Schwierigkeiten habe, füge ich den Code der Frage bei. Vielen Dank – Arvanem

+0

Du warst ganz richtig. Ich musste sicherstellen, dass getColumnCount() und getRowCount() aktualisierte Werte zurückliefern. Danke für die tolle Antwort und Einsicht. – Arvanem

+0

Gern geschehen; Ich bin froh, dass es funktioniert. Siehe auch [* Wenn eine abstrakte Klasse eine Schnittstelle implementiert *] (http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html). – trashgod