Swing JTable updaten

Khal Drogo

Bekanntes Mitglied
N'Abend,

ich habe mich heute mal ein wenig mit Swing beschäftigt und frage mich jetzt, ob es nicht eine schönere Lösung für das folgende Problem gibt: Ich habe eine Datenstruktur (es folgt Pseudocode):
Java:
class Data {
  private String s1;
  private String s2;
  // ...
}
Diese wird in einer anderen Klasse in Form einer ArrayList verwaltet:
Java:
class Manager {
  public static final String[] header = new String[] {
    "S1", "S2" // ...
  }
  private static ArrayList<Data> dataList;
  public static String[][] dataListToStringArray() {
    // @return Die komplette Liste in Form eines 2D-Arrays
  }
}
Und jetzt kommt der Knackpunkt:
Java:
class Panel extends JPanel {
  private JTable table;
  private JScrollPane pane;

  public Panel() {
    table = new JTable(Manager.dataListToStringArray(), Manager.header);
    pane = new JScrollPane(table);
    this.add(pane);
  }

  // Es geht um diese Stelle!
  public void update(Manager m) {
    this.remove(pane);
    table = new JTable(Manager.dataListToStringArray(), Manager.header);
    pane = new JScrollPane(table);
    this.add(pane);
    this.revalidate();
  }
}
Ich habe jetzt nach Möglichkeit wirklich nur das Wichtigste heraussondiert. Ich hoffe, dass dadurch möglichst abstrakt klar wird, worum es geht. Das Panel wird dann entsprechend als Komponente in ein JFrame eingesetzt.
  1. Gibt es eine elegantere Möglichkeit, die Tabelle zu aktualisieren, wenn die ArrayList erweitert wird? Da die Erweiterung per Buttondruck erfolgt, habe ich in der actionPerformed() des ActionListeners des Buttons momentan panel.update() stehen.
  2. Ist die allgemeine Struktur des Programmes in Ordnung so, oder mache ich etwas grundlegendes falsch? Falls euch da was auffällt, macht mich bitte darauf aufmerksam!
Mit freundlichen Grüßen
Xelsarion

EDIT: Zur Struktur, die Klasse Panel liegt mit anderen Klassen zusammen in einem Package gui, die Klasse Manager im Package manager und die Klasse Data schließlich im Package data. In meinem tatsächlichen Programm beziehen sich die Klassennamen natürlich etwas mehr auf ihre Funktionalität.
 

JBelarbi

Mitglied
Also versuch mal mit Table refreshing

Java:
((AbstractTableModel)table.getModel()).fireTableCellUpdated();
 

Khal Drogo

Bekanntes Mitglied
Das habe ich bei meiner Recherche via Google auch gefunden, allerdings scheine ich es nicht richtig zu benutzen, d. h. die Tabelle ändert sich nicht, obwohl die Liste definitiv erweitert wurde (das weiß ich, weil ich die Daten bei Programmende in einer Textdatei speicher). Muss ich noch etwas anderes machen, als die Daten in die ArrayList hinzuzufügen und die Methode aufzurufen?

Mit freundlichen Grüßen
Xelsarion
 

JBelarbi

Mitglied

JBelarbi

Mitglied
Also ich habe es mit TableModel probiert und die Daten sind sichtbar.
ich habe es auch mit ein Thread getestet, der nach 5 sec in der Tabelle neue Daten einfügt.

Java:
                String[] colNames = {"Name", "Surname"};
                String[][] data = {{"Nation", "Chirara"}, {"Bill", "Thompson"}};
                frame.setSize(300, 200);
                frame.setVisible(true);

                DefaultTableModel model = new DefaultTableModel(data, colNames);
                frame.add( new JTable(model));
                Thread t = new Thread(new Runnable() {

                    @Override
                    public void run() {
                        try {
                           
                            Thread.sleep(5000);
                            System.out.println("setValue2");
                            model.addRow(new Object[]{"v1", "v2"});
                        } catch (Exception ex) {
                           
                        }
                       
                    }
                });
                t.start();
 
Zuletzt bearbeitet:

Khal Drogo

Bekanntes Mitglied
Also erstmal vielen Dank für die Hilfe und Mühe!
Aufgrund deines ersten Vorschlags habe ich überhaupt mal manuell ein DefaultTableModel erstellt und meine Tabelle darüber konstruiert:
Java:
private DefaultTableModel model;
private JTable table;
private JScrollPane pane;

public Panel() {
  model = new DefaultTableModel(Manager.dataListToStringArray(), Manager.header);
  table = new JTable(model);
  pane = new JScrollPane(table);
  this.add(pane);
}
Mit Threads kenn ich mich leider nur sehr sehr oberflächlich aus, allerdings schien mir das an dieser Stelle aber auch nicht die richtige Lösung zu sein, da ich ja nicht ständig nach neuen Daten suchen will oder sie hinzufügen will, sondern wirklich nur bei Betätigung eines dafür vorgesehenen JButtons. Da dieser JButton allerdings durch die Struktur des Programmes von der Tabelle weiß und Zugriff darauf hat, habe ich kurzerhand folgendes gemacht:
Java:
// Das ist in einem anderen Panel!
add = new JButton("Hinzufügen");
add.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
    Data d = new Data(param1, param2, ...); // Parameter werden aus verschiedenen JTextFields ausgelesen
    Manager.add(d); // Fügt Element d ans Ende der ArrayList
    panel.getModel().addRow(d.toStringArray());
  }
});
Das funktioniert jetzt wunderbar, scheint mir an sich auch schon mal eine sauberere Lösung zu sein. Jetzt frage ich mich, ist es schlechter Stil, dass mein "Kontroll-Panel" vom "Anzeige-Panel" weiß (ich habe eine Referenz private Panel panel im Kontroll-Panel, die per Konstruktor übergeben wird), wenn ja, wie kann ich es besser lösen? Eventuell über die gemeinsame Superklasse?
Desweiteren: Ist das jetzt schon zu viel Funktionalität in den GUI-Klassen? Kann ich das auslagern, ohne mit Referenzen um mich schmeißen zu müssen?

Mit freundlichen Grüßen
Xelsarion

EDIT: Ich habe/hatte zwar ein private Panel panel in meinem Kontroll-Panel, das wurde auch initialisiert, ich habe aber im restlichen Konstruktor nicht mit this.panel, sondern einfach mit panel aus dem Konstruktor gearbeitet, also mein Kontroll-Panel weiß vom Anzeige-Panel, speichert die Referenz allerdings nicht dauerhaft.
 

Harry Kane

Top Contributor
Also ich würds architektonisch doch anders angehen. Zum einen gefällt es mir nicht, wenn Ableitungen von JPanel erzeugt werden, nur um darauf JPanel Methoden aufzurufen oder um per getter an Komponenten auf dem JPanel ranzukommen. Zum zweiten finde ich es schlecht, eine Gui auf mehrere JPanel Unterklassen zu verteilen, weil diese Unterklassen im Allgemeinen doch wieder Referenzen aufeinander benötigen.

Für eleganter würde ich folgendes Vorgehen halten: schreibe dir einen ActionListener, dem du Referenzen zu JTextFields und zu einem DefaultTableModel verpassen kannst. In der actionPerformed liest du die JTextFields aus, und schreibst die Daten als neue row in das TableModel.
So in etwa:
Java:
public class TableUpdater implements ActionListener{
   private ArrayList<JTextFields> felder;
   private DefaultTableModel model;
   public TableUpdater(DefaultTableModel model){
     this.model = model;
     this.felder = new ArrayList<JTextFields>();
   }
   public void actionPerformed(ActionEvent ae){
     Vector<String> row = new Vector();
     for(JTextField tf: felder){
       row.add(tf.getText());
     }
     model.addRow(row);
   }
   public void registerInput(JTextField jtf){
     felder.add(jtf);
   }
}
Dann kannst du beispielsweise in einem Fenster eine Tabelle anzeigen, in einem anderen Fenster die JTextFields und den Button. Die beiden Fenster müssen dabei nichts voneinander wissen. Es müssen nur das TableModel und die JTextFields beim ActionListener "angemeldet" sein.
 

Khal Drogo

Bekanntes Mitglied
@Harry Kane: Vielen Dank für den Hinweis, ich werde mich vermutlich am Wochenende, wenn ich genügend Zeit dafür habe, nochmal dransetzen. Werde dann deinen Vorschlag auf jeden Fall mal ausprobieren.

Mit freundlichen Grüßen
Xelsarion
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
N JTable updaten AWT, Swing, JavaFX & SWT 2
M PropertyChangeListener - JTable bei neuen Objekten updaten? AWT, Swing, JavaFX & SWT 3
L JTable aus MySQL DB updaten - Live AWT, Swing, JavaFX & SWT 7
G JTable aus Thread heraus updaten AWT, Swing, JavaFX & SWT 3
P JTable (->Datenbank) editieren/updaten AWT, Swing, JavaFX & SWT 3
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben