FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Java - Tabelle auffrischen....

Java - Tabelle auffrischen.... 2003-09-21 14:20
Piioo
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?

Re: Java - Tabelle auffrischen.... 2003-09-21 14:48
Slater
vielleicht genügt das hier?

model = new DefaultTableModel(data,columnNames); table = new JTable(model); model.setDataVector(otherData,otherColumnNames); + evtl. repaint, pack, validate usw.

Re: Java - Tabelle auffrischen.... 2003-09-21 23:48
leif
... 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).

Re: Java - Tabelle auffrischen.... 2003-09-21 23:58
Zaphod
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

Re: Java - Tabelle auffrischen.... 2003-09-22 00:45
leif
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.

Re: Java - Tabelle auffrischen.... 2003-09-22 00:53
Zaphod
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]

Re: Java - Tabelle auffrischen.... 2003-09-22 11:01
Slater
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

Re: Java - Tabelle auffrischen.... 2003-09-22 12:01
Zaphod
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]

Re: Java - Tabelle auffrischen.... 2003-09-22 12:07
Slater
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(); } }

Re: Java - Tabelle auffrischen.... 2003-09-22 12:10
Zaphod
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]

Re: Java - Tabelle auffrischen.... 2003-09-22 12:14
Slater
grummel, da ist ja auch gar kein

table = new JTable(model);
dabei..,
dann ist klar [img]http://www.fb18.de/gfx/21.gif[/img]

Re: Java - Tabelle auffrischen.... 2003-09-22 13:08
Zaphod
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]

Re: Java - Tabelle auffrischen.... 2003-09-22 22:52
Piioo
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

Re: Java - Tabelle auffrischen.... 2003-09-22 23:17
Slater
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



Re: Java - Tabelle auffrischen.... 2003-09-23 01:49
Zaphod
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 (?))

Re: Java - Tabelle auffrischen.... 2003-09-23 02:25
Zaphod
java.lang.NullPointerException
at MyTableModel.getColumnClass(MyTableModel.java:51)

public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); }