JTable und TableModel

Hallo,

ich experimentiere gerade mit JTable herum.
Ich habe eine Tabelle mit eigenem TabellenModell
(extends AbstractTableModel) gemacht. Zusätzlich arbeite ich mit einem eigenen CellRenderer und CellEditor.

Soweit funktioniert die Sache ganz gut.
Nun meine Frage bzw. das Problem:
Die Daten liegen ja alle im TabelModel. Über getValueAt kann man bestimmte Werte auslesen. Ich möchte aber folgendes erreichen:
Wenn man auf eine Zeile einen Doppelklick macht möchte ich eine, nur für die selektierte Zeile, bestimmte Aktion starten. Ich dachte mir, dass ich diese Aktion z.B: einen Link in einer Hashtabelle speichere und auf die Hastabelle mit der Zeilennummer zugreife. Die Hastabelle wäre somit auch Bestandteil des TableModel.
Wenn ich nun einen Doppelklick auf eine Zeile mache wie komme ich dann an die Daten der Hashtabelle ? Im CellRenderer oder CellEditor weiss ich zwar welche Zeile ich ausgewählt habe aber ich kenne keine Möglichkeit auf meine Hashtabelle zuzugreigfen (table.getModel(). …)
brachte mich auch nicht weiter.

Denke ich zu kompliziert oder wo liegt mein Fehler ?

Danke
Arni

Hallo,
wenn du schon ein eigenes TableModel hast, dann implementier doch einfach eine Methode (z.B. getLinkTable()), die dir deine Hashtable liefert. Oder gleich getLink(), die dir den String liefert.Oder versteh ich dich da jetzt falsch. Du kannst doch in deinem eigenen Model Methoden implementieren wie du willst. Du mußt halt dann nur das Model, das von table.getModel() zurückkommt auf dein TableModel casten,
z.B.
MyTableModel model = (MyTableModel) table.getModel();
model.getLink(xyz);

Gruß
Jodus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Wenn man auf eine Zeile einen Doppelklick macht möchte ich
eine, nur für die selektierte Zeile, bestimmte Aktion starten.
Ich dachte mir, dass ich diese Aktion z.B: einen Link in einer
Hashtabelle speichere und auf die Hastabelle mit der
Zeilennummer zugreife. Die Hastabelle wäre somit auch
Bestandteil des TableModel.
Wenn ich nun einen Doppelklick auf eine Zeile mache wie komme
ich dann an die Daten der Hashtabelle ? Im CellRenderer oder
CellEditor weiss ich zwar welche Zeile ich ausgewählt habe
aber ich kenne keine Möglichkeit auf meine Hashtabelle
zuzugreigfen (table.getModel(). …)
brachte mich auch nicht weiter.

Denke ich zu kompliziert oder wo liegt mein Fehler ?

Du denkst zu kompliziert :smile:

Mein Vorschlag. Wirf in eine definierte Spalte kein String-Objekt sondern ne eigene Klasse rein. Dieses Objekt muß 2 Eigenschaften aufweisen. Es muss um deine Aktion wissen (oder zumindest intern ne Id haben) und seine Methode toString() muss den anzuzeigenden Text liefern. Wenn dann dein Actionlistener anspringt kannst du (DeinObjekt)model.getValueAt(zeile, deine spalte) auf dein Objekt zugreifen, dessen Id abfragen… und reagieren.

Ich machs übrigends so dass ich Objekte, die ich in einer tabelle darstellen will mit einer Methode

public Object[] toTableRow(){
return new Object[] {this, „ein Datenfeld“, „und noch mehr“}
}

und

public String toString(){
return „die Objektbezeichnung“;
}

ausstatte. Meinem Model füge ich dann mit model.addRow(myObject.totableRow()); eine Zeile hinzu und erfreue mich an einer Tabelle:
„die Objektbezeichnung“ | „ein Datenfeld“ | „und noch mehr“

Michael

Hört sich gut an. Ich habe aber trotzdem noch ein kleines Verständnisproblem mit dem Object. Beinhaltet jede Spalte ein solches Object ? Dann hat doch die Spalte die Eigenschft des Objects. Wie kann
ich dann in einer Spalte z.B. eine CheckBox anzeigen.
Wenn ich die Spalten sortieren will geht das dann eigentlich noch ?

Du sieht ich bin noch Änfanger in diesen Dingen. Ich bitte um Nachsicht.

Hättest Du vielleicht ein kleines Code-Beispiel.

Danke
Arni

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hört sich gut an. Ich habe aber trotzdem noch ein kleines
Verständnisproblem mit dem Object. Beinhaltet jede Spalte ein
solches Object ? Dann hat doch die Spalte die Eigenschft des
Objects. Wie kann

Nein. Nur wie in meinem Beispiel die Spalte 0 jeder Zeile, der Rest enthält Strings (oder was immer die toTableRow() liefert)

ich dann in einer Spalte z.B. eine CheckBox anzeigen.

Nur anzeigen? Dann einen Renderer. Auch editieren, dann einen Editor und einen Renderer.

JCheckBox check = new JCheckBox();
DefaultCellEditor edi = new DefaultCellEditor(check);
tabelle.getColumnModel().getColumn(1).setEditor(edi);

Und schon hast du in der gesamten Spalte 1 eine Checkbox als Editor. da macht es Sinn, die toTableRow etwas so zu machen:

public Object[] toTableRow(){
return new Object[]{this, new Boolean(true), „Ein String“};
}

Dein Model muss nur noch bei der Methode

isCellEditable(int row, int col){ //hies die so???
if (col == 1) return true;

}

liefern. Nun kannst du editieren, siehst aber in der Darstellung nur ein true oder false (eben die toString() Methode eines Boolean Objektes). Damit das auch schön angezeigt wird brauchst du noch einen Renderer, der von JCheckBox erbt. Am besten eine innere Klasse in deinem Fenster

class CheckRenderer extends JCheckBox implements TableCellRenderer{
public Component getTableCellRendererComponent(…, Object value, …){
//oder so ähnlich, mit jede menge Parameter, unter anderem value
this.setSelected(((Boolean)value).booleanValue();
//damit setzt du den Renderer (also die Checkbox) auf den Wert dr Zelle
return this;
}
}

Diese Klasse musst du nur noch der Zelle mitgeben, ähnlich dem Editor:

tabelle.getColumnModel().getColumn(1).setRenderer(new CheckRenderer());

Wenn ich die Spalten sortieren will geht das dann eigentlich
noch ?

Sortieren (z.B. auf Tabellenkopf klicken) ist keine Standardfunktion (zumindest in 1.3, ist das in 1.4 noch so??) und komplizierter. (und sprengt das hier deutlich)

Du sieht ich bin noch Änfanger in diesen Dingen. Ich bitte um
Nachsicht.

macht ja nix. Tabellen sind allerdings auch das komplizierteste was man sich so vornehmen kann, es geht aber auch fast alles.

Hättest Du vielleicht ein kleines Code-Beispiel.

Habs versucht.

Danke
Arni

Bitte. Michael