Hallo,
ich habe eine Klasse MainWindow.java. Dort wird die grafische Oberfläche meines Programms erstellt und u.A. auch ein JTable mit einem DefaultTableModel definiert.
Zum Aktualisieren des Inhaltes des JTables nutze ich die Funktion:
Java:
updateCustomerTable()
Nun möchte ich gerne aus einem anderen aktiven Fenster diese Funktion zum Neuzeichnen des Tabelle aufrufen.
Abschnitte aus der MainWindow.java:
Java:
publicvoidupdateCustomerTable()throwsSQLException{Vector<String>VecColumnName=newVector<String>();VecColumnName.add("ID:");VecColumnName.add("Name:");VecColumnName.add("Vorname:");VecColumnName.add("Geb.-Datum:");VecColumnName.add("Straße:");VecColumnName.add("PLZ:");VecColumnName.add("Stadt:");VecColumnName.add("Email:");VecColumnName.add("Telefon:");VecColumnName.add("Handy:");VecColumnName.add("Bemerkung:");// Tabellengrundgerüst erstellen
tableCustomer =newJTable();
tableCustomer.setSelectionBackground(Color.darkGray);
tableCustomer.setAutoCreateRowSorter(true);// Tabellenüberschrift formatierenJTableHeader header = tableCustomer.getTableHeader();
header.setFont( header.getFont().deriveFont(16));// Instanz des DBHandler wird erstelltDBHandler dbH =newDBHandler();// Ergebnis der Datenbankabfrage wird in Vector geschriebenVector<Vector<String>>VecData=newVector<Vector<String>>();VecData= dbH.getCustomerData();// Neues DefaultTableModel wird erstelltDefaultTableModel model =(DefaultTableModel) tableCustomer.getModel();// Ergebnisse der Datenbankabfrage werden mit Spaltenüberschrift in Tabelle geschrieben
tableCustomer.setModel(newDefaultTableModel(VecData,VecColumnName));
scrollPaneCustomer.setViewportView(tableCustomer);// Tabelle neu zeichnen
model.fireTableDataChanged();}
Wie ist hierbei die beste practise?
Eine neue Instanz der MainWindow fällt raus, da hier dann wieder eine neue grafische Oberfläche erstellt wird. Ein statischer Zugriff ist ebenfalls nicht zu empfehlen.
publicclassFoo{privateMainClass main =null;publicFoo(MainClass main){this.main = main;}// main.updateCustomerTable();}
Wobei deine Methode keine updateMethode ist denn du erstellst immer wieder ein neues model und einen neuen table.
wenn du updaten / refreshen willst dann solltest du nur die daten neu holen und dem model übergeben.
Ich rufe das neue Fenster aus dem ich den Befehl an das Hauptfenster für das Neuzeichnen der Tabelle schicke, mittels ActionListener auf. Momentan sieht der Aufruf so aus:
Hallo
Man kann zwar eine Referenz übergeben, das ist auch sicher einfacher hat aber den Nachteil das dein Customer Window nicht mehr in Anderen Klassen verwendet werden kann welche dein MainWindow nicht kennen.
Meiner Meinung nach ist es besser und auch richtiger hier einen Listener bzw Callback zu verwenden. Du könntest z.B. einen PropertyChangeListener von Swing verwenden oder deinen eigenen Callback implementieren.
Hier ein kleines Beispiel wie sowas mit dem PropertyChangeListener geht.
In der MainFrame Klasse wird der Listener implementiert und wenn die Property mit dem richtigen Namen kommt dann wird die UpdateMethode aufgerufen. Das Implementierte Interface wird der CustomerDialog Klasse jedesmal hinzugefügt wenn diese Initialisiert wird.