ubuntuusers.de

Java - JTable aktualisieren

Status: Ungelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

Wajanja_simba

Anmeldungsdatum:
5. Dezember 2009

Beiträge: 149

Hallo,

zum programmieren nutze ich Eclipse. In Java möchte ich eine Tabelle erstellen, die Daten aus einer Array anzeigt. Das Programm funktioniert soweit ganz gut, aber ich kriege es nicht hin, die Tabelle so zu Aktualisieren, dass die Daten aus dem Array neu eingelesen und abgebildet werden.

Die Tabelle baue ich wie folgt:

1
2
        final JTable table = new JTable(rowData, columnNames);
        f.add(new JScrollPane(table));

"columnNames" enthält die Spalten-Namen (3 Stück) und "rowData" ist ein zweidimensionaler Array.

1
2
3
4
        static String[][] rowData = new String[1][3];
        rowData[0][0] = "";
        rowData[0][1] = "";
        rowData[0][2] = "";

Mit der Methode "arrayplus()" kann ich dem Array jeweils eine Weitere Spalte hinzufügen.:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
    public static void arrayplus(String nul, String eins, String zwei) {
        if (erste) {
            rowData[0][0] = nul;
            rowData[0][1] = eins;
            rowData[0][2] = zwei;
            erste = false;
        } else {
            String[][] data = new String[rowData.length + 1][3];
            int c = 0;
            while (c < rowData.length) {
                data[c][0] = rowData[c][0];
                data[c][1] = rowData[c][1];
                data[c][2] = rowData[c][2];
                c++;
            }
            rowData = data;
            rowData[rowData.length - 1][0] = nul;
            rowData[rowData.length - 1][1] = eins;
            rowData[rowData.length - 1][2] = zwei;
        }
    }

Bislang funktioniert alles so, wie es sollte. Wie kann ich jetzt aber bei jedem Aufruf von "arrayplus()" die Tabelle so Aktualisieren, das sie auch die neuen Daten anzeigt?

Fielen Dank im Voraus

PS: Ich weiß, das man es an manchen Stellen vielleicht schöner machen könnte, aber bislang hatte ich damit keine Probleme.

BodomBeachTerror

Anmeldungsdatum:
24. März 2008

Beiträge: 788

Normalerweise benutzt man da ein TableModel

Wajanja_simba

(Themenstarter)

Anmeldungsdatum:
5. Dezember 2009

Beiträge: 149

Danke für die Hilfe.

Ich habe jetzt eine neue Klasse für das TableModell erstellt.:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import javax.swing.table.AbstractTableModel;

class SquareTableModelSimple extends AbstractTableModel
{
  private static final long serialVersionUID = 4817823957300304667L;

@Override public int getRowCount()
  {
    return 0;
  }

  @Override public int getColumnCount()
  {
    return 0;
  }

  @Override public Object getValueAt( int row, int col )
  {
    return null;
  }
}

und rufe es mit

1
        f.getContentPane().add(new JScrollPane(new JTable(new SquareTableModelSimple())));

auf.

Wie kann ich jetzt meine Daten von "columnNames" und "rowData" einbringen?

BodomBeachTerror

Anmeldungsdatum:
24. März 2008

Beiträge: 788

Naja du musst in dem Model die Daten speichern und gegebenenfalls welche hinzufügen. Wenn welche hinzugefügt werden kannst du einfach ein Event firen, damit der JTable aktualisiert wird.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
class MyTableModel extends AbstractTableModel {
    private String[] columnNames = ...//same as before...
    private Object[][] data = ...//same as before...

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {
        return data.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return data[row][col];
    }
}

Siehe auch: http://download.oracle.com/javase/tutorial/uiswing/components/table.html#fire

Wajanja_simba

(Themenstarter)

Anmeldungsdatum:
5. Dezember 2009

Beiträge: 149

Danke für die Hilfe, aber gibt es keine einfachere Art eine Tabelle anzulegen, die eine feste Anzahl an Spalten hat (in meinem Fall 3) und die ihre Daten aus einem zweidimensionalen-Array bezieht, die Zeilen anhand des Arrays aufbaut, und per Aufruf von z.B. table.update(); die Daten komplett neu einliest und darstellt? So etwas einfaches wie:

1
2
        final JTable table = new JTable(rowData, columnNames);
        f.add(new JScrollPane(table));

Am Anfang hatte ich ja eine Tabelle mit dem o.g. Befehl gebaut. Sah gut aus, lief gut, war einfach. Das einzige Problem war: wenn die Tabelle einmahl gebaut war, ließ sie sich nicht aktualisieren.

BodomBeachTerror

Anmeldungsdatum:
24. März 2008

Beiträge: 788

Nein, so was gibt es meines Wissens nicht. Aber da dein Anwendungsfall noch ziemlich simpel ist, könnte dir auch das DefaultTableModel helfen (http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/table/DefaultTableModel.html)

Hier kannst du Sachen hinzufügen und die Anzahl von Spalten und Reihen setzen. Wenn du wirklich nur dein Array verwalten möchtest könntest du dir aber eigentlich ein eigenes TableModel nach deinen Wünschen implementieren. Dort machst du zb eine Methode setData(int[][] myData), und firest immer wenn die Daten neu gesetzt werden ein fireTableDataChanged Event, damit der ganze Table aktualisiert wird. Also im Prinzip genau das was du haben willst 😉 (musst eben nur noch ein wenig selber was machen 😀)

Wenn dein Array eine feste Größe hat, tuts auch so was zb:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class MyTableModel extends AbstractTableModel {
    private String[] columnNames;
    private Object[][] data;

    public MyAtbleModel(String[] columnNames, Object[][] data) {
      this.columnNames = columnNames;
      this.data = data;
    }

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {
        return data.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

   public void update() {
       fireTableDataChanged();
   }
}

Du übergibst einmal dein data Array, änderst dies, und immer wenn du es geändert hast rufst du update() auf, dann wird der ganze JTable aktualisiert. Aber schau dir mal das DefaultTableModel and, vll. tuts das auch schon 😉

Wajanja_simba

(Themenstarter)

Anmeldungsdatum:
5. Dezember 2009

Beiträge: 149

Vielen Dank für die Mühe, aber anscheinend bin ich zu blöd.

Ich habe jetzt das "DefaultTableModel" verwendet.

Methode 1:

1
        f.getContentPane().add(new JScrollPane(new JTable(new DefaultTableModel(rowData, columnNames))));

Ich schaffe es nicht, irgendwelche Methode aufzurufen.

1
DefaultTableModel.this.fireTableDataChanged();

bringt

No enclosing instance of the type DefaultTableModel is accessible in scope

Methode 2:

1
2
3
        final JTable table = new JTable(rowData, columnNames);
        f.add(new JScrollPane(table));
        table.setModel(new DefaultTableModel());

zwar habe ich schon die beiden Arrays drin, aber das Aktualisieren geht nicht.

Antworten |