Hallo!
Meine Applikation besteht aus einer GUI mit Tabelle.
Beim Start der Applikation wird die Gui aufgebaut und initialisiert, eine leere Tabelle wird gezeichnet und mein Datenbankobjekt welches von AbstractTableModle erbt, also TableModel gesetzt.
Im Anschluss wird in einem eigenen Thread aus einer großen xml Datei eine Vielzahl von Objekten eingelesen, was einige Sekunden dauern kann. Wenn dies abgeschlossen ist, wird die Tabelle mit den neuen Objekten (momentan 2300 an der Zahl) geupdated.
Das updaten geschieht mit der Funktion
und die komplette Prozedur die das Einlesen und Verarbeiten der xml Datei anstößt steht in einem Thread:
Die GUI lass ich mir mit Jigloo generieren und der Teil mit der jScrollPane -> jTable sieht so aus:
Soweit so gut, funktioniert bis hierhin auch. GUI wird komplett erzeugt, Dateien verarbeitet und in der Tabelle aktualisiert.
Problem:
Das einzige was nicht aktualisiert wird sind die Scrollbars. Sie bleiben in dem Umfang einer leeren Tabelle, nachdem ich ca. 2300 Objekte der Tabelle hinzugefügt habe, bekomme ich eben nur den Bruchteil zu sehen, der gerade für das erste Anzeigen der Tabelle abgefragt wurde.
Da ich von meiner TableModel Klasse keine Referenz auf die databaseFrame Klasse oder deren Objekte wie die Tabelle oder das ScrollPane direkt habe, kann ich deren redraw Methoden auch nicht direkt aufrufen.
Daher:
Wie kann ich die ScrollPane implizit aktualisieren lassen ohne meine Programmstruktur groß umbauen zu müssen?
Danke für Antworten.
Meine Applikation besteht aus einer GUI mit Tabelle.
Beim Start der Applikation wird die Gui aufgebaut und initialisiert, eine leere Tabelle wird gezeichnet und mein Datenbankobjekt welches von AbstractTableModle erbt, also TableModel gesetzt.
Im Anschluss wird in einem eigenen Thread aus einer großen xml Datei eine Vielzahl von Objekten eingelesen, was einige Sekunden dauern kann. Wenn dies abgeschlossen ist, wird die Tabelle mit den neuen Objekten (momentan 2300 an der Zahl) geupdated.
Das updaten geschieht mit der Funktion
Java:
fireTableDataChanged();
Java:
Database databaseFrame = new Database();
databaseFrame.setQuestDatabase(qdb);
databaseFrame.initGUI();
databaseFrame.setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
// TODO: Move somewhere else
File x = new File("packages/Quests.xml");
InputStream in;
in = new FileInputStream(x);
XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty("javax.xml.stream.isValidating", false);
XMLStreamReader parser = factory.createXMLStreamReader(in);
qdb.readDatabaseFromXmlReader(parser);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Die GUI lass ich mir mit Jigloo generieren und der Teil mit der jScrollPane -> jTable sieht so aus:
Java:
{
jQuestDatabaseTable = new JTable();
//jQuestTableScrollPane.setViewportView(jQuestDatabaseTable);
jQuestTableScrollPane = new JScrollPane(jQuestDatabaseTable);
jQuestDatabaseTable.setModel(getQuestDatabase());
jQuestDatabaseTable.setDebugGraphicsOptions(DebugGraphics.BUFFERED_OPTION);
jQuestDatabaseTable.setPreferredSize(new java.awt.Dimension(751, 525));
jQuestDatabaseTable.setFillsViewportHeight(true);
}
Soweit so gut, funktioniert bis hierhin auch. GUI wird komplett erzeugt, Dateien verarbeitet und in der Tabelle aktualisiert.
Problem:
Das einzige was nicht aktualisiert wird sind die Scrollbars. Sie bleiben in dem Umfang einer leeren Tabelle, nachdem ich ca. 2300 Objekte der Tabelle hinzugefügt habe, bekomme ich eben nur den Bruchteil zu sehen, der gerade für das erste Anzeigen der Tabelle abgefragt wurde.
Da ich von meiner TableModel Klasse keine Referenz auf die databaseFrame Klasse oder deren Objekte wie die Tabelle oder das ScrollPane direkt habe, kann ich deren redraw Methoden auch nicht direkt aufrufen.
Daher:
Wie kann ich die ScrollPane implizit aktualisieren lassen ohne meine Programmstruktur groß umbauen zu müssen?
Danke für Antworten.