JTable strecken & d. Spalten Vorgeschr. Gr. geben

Inhalten hineinbekommen?
Ist doch nicht schwer. Zumindest dachte ich mir. ;-)
Code:
String columnNames[] = {"Name","WKN","Stück","Währung","Devisenkurs","Einstandskurs","Datum","Kurs","Kapital","Veränderung","Anteil"};
  String data[][] = {{"bla","bla","bla","bla","bla","bla","bla","bla","bla","bla","bla"}};
  JTable tab = new JTable(data,columnNames){
    public boolean isCellEditable(int rowIndex, int columnIndex) {
      return false;
    }
  };
Oder meinst Du was anderes?

Taik
 
So wie ich im Internet gelesen habe und falls ich alles richtig verstanden habe, komme ich um meinen eigenen TableModel nciht herum. Ich konnte rausfinden, dass ich folgende Funktionen implementieren muss:
Class getColumnClass( int columnIndex )
Liefert das allgemeinste Klassenobjekt, welches die Spalte beschreiben kann.
int getColumnCount()
Liefert die Anzahl Spalten.
String getColumnName( int columnIndex )
Gibt den Namen der Spalte columnIndex zurück.
int getRowCount()
Liefert die Anzahl der Zeilen.
Object getValueAt( int rowIndex, int columnIndex )
Gibt den Eintrag an der Stelle columnIndex und rowIndex zurück.
void setValueAt( Object aValue, int rowIndex, int columnIndex )
Setzt den Wert an die gegebene Stelle.
boolean isCellEditable( int rowIndex, int columnIndex )
Liefert true, wenn die Zelle an rowIndex und columnIndex editierbar ist.
void addTableModelListener( TableModelListener l )
Fügt einen Ereignisbehandler hinzu, der immer dann informiert wird, wenn Daten geändert werden.
void removeTableModelListener( TableModelListener l )
Entfernt den Ereignisbehandler.

Was ich immer noch nicht vorstellen kann, wie ich auf die einzelne Einträge zugreifen kann? Mit welchem Befehl sollte ich auf die i. Zeile zugreifen? Und wie kann ich die Zeile hinzufügen, wenn ich ein Array von Daten habe (zumindest denke ich, dass ich es habe). Ich dachte, dass Arrays eine vordefinierte Länge haben und lassen sich nur sehr schwer erwitern. Einziges was mir in den Sinn kommt, sind die Listen.

Gruß

Taik
 
taik84 hat gesagt.:
So wie ich im Internet gelesen habe und falls ich alles richtig verstanden habe, komme ich um meinen eigenen TableModel nciht herum.
Genau.
Ich konnte rausfinden, dass ich folgende Funktionen implementieren muss:
Class getColumnClass( int columnIndex )
Muss nicht, kann. Ist dafür gut, Renderer und/oder Editor für verschiedene Spalten unterschiedlich zu setzen
int getColumnCount()
Korrekt.
String getColumnName( int columnIndex )
Korrekt.
Korrekt.
Object getValueAt( int rowIndex, int columnIndex )
Korrekt.
void setValueAt( Object aValue, int rowIndex, int columnIndex )
Korrekt.
boolean isCellEditable( int rowIndex, int columnIndex )
Nicht nötig, aber kann implementiert werden.
void addTableModelListener( TableModelListener l )
Nicht nötig.
void removeTableModelListener( TableModelListener l )
Auch nicht nötig.

Was ich immer noch nicht vorstellen kann, wie ich auf die einzelne Einträge zugreifen kann? Mit welchem Befehl sollte ich auf die i. Zeile zugreifen? Und wie kann ich die Zeile hinzufügen, wenn ich ein Array von Daten habe (zumindest denke ich, dass ich es habe). Ich dachte, dass Arrays eine vordefinierte Länge haben und lassen sich nur sehr schwer erwitern. Einziges was mir in den Sinn kommt, sind die Listen.

Gruß

Taik

Genau. Wenn Du veränderbare Daten, vor allem Zeilen haben möchtest, muss ein dynamisches Konstrukt her. Also eine ArrayList oder ein Vector. Je nachdem, ob es threadsicher oder schnell sein soll.
BTW es geht auch - ist aber nicht meine Art der Programmierung - via addTableRow oder addRow, der Tabelle einen neuen Datensatz hinzuzufügen. Die persönlichen Anpassungen dabei sind aber begrenzt.
 
Eine kleine Verständnissfrage:

In der MyTableModel muss doch irgend ein Verweis auf die Daten in der Tabelle sich finden, oder?

Wie solle ich es machen? Bei der Deklaration einfach oben eine neue Variable einfügen?
Code:
...
Object[][] data;
String[] colName;
...
public MyTableModel(Object[][] data,String[] colName){
    super(data,colName);
    this.data=data;
    this.colName=colName;
}

Aber dann speichere ich doch die Daten doppelt, oder?
Oder ist es vielleicht besser eigene Liste aufzubauen? Nimmt sie viel Speicher in Anspruch bei max 200 einträgen?
Was ist auch für ältere Computer besser?

Danke.

Gruß

Taik
 
taik84 hat gesagt.:
Eine kleine Verständnissfrage:

In der MyTableModel muss doch irgend ein Verweis auf die Daten in der Tabelle sich finden, oder?
Genau.
Wie solle ich es machen? Bei der Deklaration einfach oben eine neue Variable einfügen?
Jo.
Aber dann speichere ich doch die Daten doppelt, oder?
Dann leg sie halt erst im TabelModel an. ;)
Oder ist es vielleicht besser eigene Liste aufzubauen?
Sobald Du die Daten dynamisch halten möchtest, also Zeilen hinzufügen, löschen usw., wirst Du natürlich Probleme mit Arrays bekommen. Deshalb ist es üblich, mit Listen zu Arbeiten. Jeder Listeneintrag enthält dann quasi eine Zeile.
Nimmt sie viel Speicher in Anspruch bei max 200 einträgen?
Was ist auch für ältere Computer besser?

Danke.

Gruß

Taik

Darum mach Dir mal keine Gedanken. :)
 
Hallo

Ich suche gerade nach einem BeispielCode für TableModel, das mit veränderlichen Daten arbeitet.

Ich habe: TableModel
Listen-Klasse
ListenElement-Klasse
Hauptfenster-Klasse
TableModel greift auf die Liste und fügt hinzu und löscht die LstenElemente der Liste. Liste ist als Doppeltverkettete Liste mit referenzen auf das erste, letzte und ein Element dazwischen.

Danke

Gruß

Taik
 
Eine Verständnissfrage:

Wenn ich die Daten in der Liste, die innerhalb der TableModel erzeugt wird, verändere, was geschiet dann?

Ich habe folgendes gemerkt: Wenn ich die oben erwähnte Liste mit hilfe einer Prozedur, die sich in TableModel-Klasse befindet, aber im Grunde genommen nur auf die Listen-Prozedur zugreift, die alle ListenElemente in der Liste löscht, taucht immer ein Fehler auf:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Kaufliste.goToPosition(Kaufliste.java:59)
at DepotTableModel.getValueAt(DepotTableModel.java:32)
at javax.swing.JTable.getValueAt(Unknown Source)
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Danke für die HIlfe.

Gruß

Taik
 
Ach und noch eine Frage:
Wenn ich versuche bevor ich ein Wert zurückgebe irgendwas auszurechnen, gibt es ein Fehler.
Code:
...
case 6:
   GregorianCalendar hlp = data.goToPosition(row).getDate(); //GregorianCalendar
   return new String(hlp.MONTH+"/"+hlp.DAY_OF_MONTH+"/"+hlp.YEAR);
...
Auf dieser weise gibt es keinen Fehler, aber ich bekomme nur den Klassenverweis:
Code:
...
case 6:
   return data.goToPosition(row).getDate();
...

Danke

Gruß

Taik
 
Zuletzt bearbeitet:
Zurück