Ich versuche schon seit einiger Zeit eine Tabelle aufzufrischen. Ich erstelle eine Tabelle und lade alles in oder aus einem array aus einer anderen class. Nun wird das array aber komplett verändert, wärend die Tabelle schon da ist und ich weis nicht, wie ich die Tabelle auffrischen kann, so dass sie die daten aus dem array benutzt…. (wenn es unverständlich ist, kanns ja später nochmal versuchen =) )
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TabelleDB extends JFrame implements ActionsListener {
Daten daten;
JTable table;
.
.
.
// hier erstelle ich dann das Tablle, dass aus dem array liest in class Daten
daten = new Daten();
table = new JTable(daten.getrowData(), daten.getcolumnNames());
.
.
.
}
import javax.swing.*;
public class Daten {
private static int lang = 100, breit = 5;
private static final String columnNames[] =
{
"1", "2", "3", "4", "5"
};
private static String rowData[][] = new String[lang][breit];
public String[] getcolumnNames() {
return columnNames;
}
public String[][] getrowData() {
return rowData;
}
}
das array rowData verändere ich komplet, wie frische ich die tabelle auf und sag ihr, dass sie das arry nochmal laden soll..,
(hab schon dran gedacht die GUI zu schliessen und neu zu öffnen mit dem neuen array, aber das ist nicht so toll)
weis wer einen rat?
vielleicht genügt das hier?
model = new DefaultTableModel(data,columnNames);
table = new JTable(model);
model.setDataVector(otherData,otherColumnNames);
+ evtl. repaint, pack, validate usw.
...
model.setDataVector(otherData,otherColumnNames);
+ evtl. repaint, pack, validate usw.
Sollte nicht nötig sein.
setDataVector sollte an dem Model auch fireTableDataChanged() o.ä. aufrufen, wodurch ein entsprechender Event an den JTable geschickt wird, damit der sich neu zeichnet.
Aber IANASG (I am not a Swing guru).
Ich hab bisher das mit dem DataVector weggelassen, das klappt auch. Kann man sagen, ob eine Methode eleganter ist als die andere?
//table ist die alte JTable
model = new DefaultTableModel(newdata,columnNames);//colnames sollten sich ja nicht unbedingt ändern
table = new JTable(model);
scrollPane.repaint();
EDIT: Die JTable table befindet sich in dem JScrollpane scrollPane
Ich hab bisher das mit dem DataVector weggelassen, das klappt auch. Kann man sagen, ob eine Methode eleganter ist als die andere?
Ich verstehe noch nicht ganz, was Du machst.
Erzeugst Du bei jeder Änderung des Tabelleninhalt ein neues Model? Oder sogar jedesmal ein neues JTable?
Das fände ich wirklich nicht elegant.
Erzeugst Du bei jeder Änderung des Tabelleninhalt ein neues Model? Oder sogar jedesmal ein neues JTable?
Aber es funktioniert, und da hab ich nichts Weiteres mehr probiert [img]
http://www.fb18.de/gfx/22.gif[/img]
Ich hab bisher das mit dem DataVector weggelassen, das klappt auch. Kann man sagen, ob eine Methode eleganter ist als die andere?
ich würde sagen extra 2 neue objekte zu erzeugen ist
unelegant und gefährlich,
und ich weiss ja nicht wie du die einsetzt,
aber wenn die alte Table schon in ein JScrollPane eingebunden ist,
dann interessiert es diese doch nicht ob du irgendwo anders eine neue erzeugst,
also das repaint sollte nix bringen es sei denn du hast eine
komplizierte eigene paint()-Operation,
die aus deinem ScrollPane die alte entfernt und die neue Table einfügt,
und schliesslich ist es ja möglich, das andere Objekte noch
Referenzen auf die Table/ Model haben,
für diese wäre es auch ungüstig wenn du neue Table/ Model erzeugst
Der Scrollpane weiß doch nur, dass table in ihm ist, aber nicht, worauf table zeigt, daher muss ich keine entfernen und neu einfügen.
Aber die andere Lösung scheint wirklich hübscher zu sein [img]
http://www.fb18.de/gfx/25.gif[/img]
table ist eine Referenz, ScrollPane hat auch eine Referenz,
aber nicht auf diese Referenz sondern auf ein Object,
falls du ein funktionierendes Beispielprogramm hast,
würde mich das überzeugen, meins tut nicht viel:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TestFrame extends JFrame {
DefaultTableModel model;
JTable table;
String[] columnNames = {"eins"};
JScrollPane scrollPane;
public TestFrame() {
model = new DefaultTableModel(
new String[][]{{"00"},{"01"}},columnNames);
table = new JTable(model);
JPanel dataPanel = new JPanel();
dataPanel.setLayout(new BorderLayout());
dataPanel.add(table.getTableHeader(), BorderLayout.NORTH);
dataPanel.add(table, BorderLayout.CENTER);
scrollPane = new JScrollPane(dataPanel);
JButton testButton = new JButton("Test");
testButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
model = new DefaultTableModel(
new String[][]{{"00"},{"01"},{"02"}},
columnNames);
table = new JTable(model);
//table.setModel(model);
//model.setDataVector(
// new String[][]{{"00"},{"01"},{"02"}},
// columnNames);
scrollPane.repaint();
}
});
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(300,400));
panel.add(testButton);
panel.add(scrollPane);
getContentPane().add(panel);
pack();
setVisible(true);
}
public static void main(String[] args) {
new TestFrame();
}
}
Also ich werd jetzt nicht die ganze Klasse posten, aber
// zeichnet die Tabelle neu, damit übernommene Änderungen auch angezeigt werden
private void tabelleNeuZeichnen() {
datentabelle = v.toArray(); //Daten der Tabelle
MyTableModel myNewModel = new MyTableModel(datentabelle, columnNames);
ausgabeTabelle.setModel(myNewModel);
TableColumn column = ausgabeTabelle.getColumnModel().getColumn(0);
column.setPreferredWidth(50);
column = ausgabeTabelle.getColumnModel().getColumn(1);
column.setPreferredWidth(160);
scrollPane.repaint();
v.createHtmlFile();
}
Das funktioniert [img]
http://www.fb18.de/gfx/23.gif[/img]
grummel, da ist ja auch gar kein
table = new JTable(model);
dabei..,
dann ist klar [img]
http://www.fb18.de/gfx/21.gif[/img]
upps [img]
http://www.fb18.de/gfx/22.gif[/img]
Naja.. ist ja auch schon ein Weilchen her, dass ich das geschrieben hab [img]
http://www.fb18.de/gfx/25.gif[/img]
entwerder verstehe ich eure antworten nciht (oder kann sie nicht verwirklichen), oder ich habs schlecht beschrieben…
es soll so ablaufen:
-ich öffne die GUI, die Tabelle ist leer am anfang
-nun gehe ich ins menu und lade die daten aus einer datei
-diese daten werden in ein array geladen
-nun muss die Tabelle die daten, die im array sind anzeigen
(wenn ich versuch den ersten vorschlag zu verwirklichen bekomm ich eine NullPionterException)
ich hab das ganze mal so gemacht, das ich die Tabelle schleisse und wieder neu lade mit den neuen daten…finde sie lösung aber nciht besonders schön
interessante Geschichte, ohne Frage,
aber irgendwie nicht so produktiv ;)
alles zum Table aktualisieren ist schon gesagt,
die Vorgehensweise von Zaphod ist einfacher,
da kann man weniger Fehler machen
aber natürlich können tausend andere Dinge schief gehen,
NullPointerExceptions sind normalerweise sehr einfach zu finden,
poste doch mal den Code/ schick an
slaterb@gmx.de
Das mit der NullpointerException kommt mir bekannt vor. Wenn die Tabelle leer ist, und man was darein packen will, kommt die. Irgendwo versucht das TableModel auf die erste (und zwar nicht vorhandene) Zeile zuzugreifen, wenn ich mich recht erinnere. Lösung: Tabelle nie leer werden lassen [img]
http://www.fb18.de/gfx/25.gif[/img] (Zur Not eine leere Zeile (?))
java.lang.NullPointerException
at MyTableModel.getColumnClass(MyTableModel.java:51)
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}