jTable mit JComboBox auslesen

Newcommer

Mitglied
Hallo Forum,
mein Problem:
Ich habe in einer JTable eine editierbare Spalte, in den Zellen dieser Spalte eine JComboBox um einen Wert zu wählen/ändern. Das funktioniert nach der Anleitung von SUN "How to Use Tables" auch prima. Meine JComboBox enthält (extra Klasse) einen String, der angezeigt wird und eine ID, die ich auslesen und speichern möchte.
Wie kann ich die ID und nicht den angezeigten String bekommen?
Java:
class Row {					  // Klasse zum Füllen der jCombobox mit ID und Value
    private String id, val;   // habe ich auch hier aus dem Forum

    public Row(String id, String val) {
        this.id = id;
        this.val = val;
    }
    public String getId() {
        return id;
    }
    public String getVal() {
        return val;
    }
    public String toString() {
        return val;
    }

...

TableColumn KSTColumn = jTable_letzteDS.getColumnModel().getColumn(3);
	    JComboBox KSTcomboBox = new JComboBox();
	    KSTcomboBox.addActionListener(new java.awt.event.ActionListener() {
	    	public void itemStateChanged(java.awt.event.ActionEvent e) {
	    		read_id();
	    	}
	    });
	    KSTcomboBox.addItem(new Row("0", "111"));
	    KSTcomboBox.addItem(new Row("1", "112"));
	    KSTcomboBox.addItem(new Row("2", "211"));
	    KSTcomboBox.addItem(new Row("3", "311"));
	    KSTColumn.setCellEditor(new DefaultCellEditor(KSTcomboBox));

...

void read_id() {			                                    // soll IDaus Tabelle lesen
		String kst = jTable_letzteDS.getValueAt(jTable_letzteDS.getSelectedRow(), 3).toString();
   // So bekomme ich den in der Zelle angezeigten Wert !!!
   // Wie komme ich hier an die ID ????
}
Wie gesagt das Auslesen des angezeigten Wertes ist kein Problem, nur brauche ich die ID.
Wenn die JComboBox nicht in einer JTable-Zelle steckt, komme ich über
Java:
((Row) KSTcomboBox_Sub.getSelectedItem()).getId()
an die ID. Aber in einer Tabellenzelle ???

Vielen Dank schon mal.
 
Zuletzt bearbeitet:
Hallo Michael...,

danke für die Antwort.
So richtig verstehe ich das noch nicht.
Wenn ich den Rückgabewert der toString() aus Row anpasse, also statt val id eintrage (siehe code), sehe ich doch in der jComboBox auch nur die id zur Auswahl.
Java:
class Row {																// Klasse zum Füllen der jCombobox mit Value und ID
    private String id, val;

    public Row(String id, String val) {
        this.id = id;
        this.val = val;
    }
    public String getId() {
        return id;
    }
    public String getVal() {
        return val;
    }
    public String toString() {
        return id;
    }
}
Die richtige Tabelle sieht dann so aus:
jtable.gif

Was mache ich falsch bzw. wie hast Du das gemeint?

MfG
 
Mit einem eigenen TableCellRenderer kannst Du definieren, was in der Tabelle und mit einem eigenen ListCellRenderer kannst Du definieren, wie das Objekt in der ComboBox dargestellt wird.

Wo Du jetzt genau was benötigst ist mir allerdings nicht ganz klar.
 
Hallo Michael,

ich möchte in den Tabellenzellen und in der Combobox die Werte (z.B.: 211) angezeigt bekommen.
Beim Auslesen der Zellinhalte benötige ich aber die ID, die mit in der Combobox enthalten ist. Die ID und nicht die Werte speichere ich in einer Datenbank.
Zu meinem Verständnis noch eine "dumme" Frage: Ist die Combobax immer in der Tabellenzelle enthalten oder nur ab dem Moment des Klickens und Wärend des Editierens.

Danke schon mal.
 
ich möchte in den Tabellenzellen und in der Combobox die Werte (z.B.: 211) angezeigt bekommen.
Beim Auslesen der Zellinhalte benötige ich aber die ID, die mit in der Combobox enthalten ist. Die ID und nicht die Werte speichere ich in einer Datenbank.
Eigentlich müsstest Du das Objekt in der Zelle nach Row casten und darauf die Methode getID() aufrufen können.
Java:
Row row = (Row) table.getValueAt(x, y);
speichernInDatenbank(row.getID());
Zu meinem Verständnis noch eine "dumme" Frage: Ist die Combobax immer in der Tabellenzelle enthalten oder nur ab dem Moment des Klickens und Wärend des Editierens.
Letzteres, in der Tabelle (bzw. deren Model) ist keine ComboBox enthalten.
Es wird ein und diesselbe ComboBox zum Editieren aller Zellen gleichen "Typs" verwendet. Sonst müsste ja für jede Zellen eine ComboBox instanziert werden und das könnte bei grösseren Tabellen ganz schon auf den Speicher gehen.
Genauso wird zum Darstellen der Zelleninhalte ein Renderer (pro "Zellen-Typ") verwendet.
 
Hallo Michael, :applaus:

danke für die Antwort. Es funktioniert so wie ich mir das vorgestellt hatte. :toll:
Hier noch mal der Code, falls es noch jemand braucht.
Java:
class Row {                   // Klasse zum Füllen der jCombobox mit ID und Value
    private String id, val;   // habe ich auch hier aus dem Forum
 
    public Row(String id, String val) {
        this.id = id;
        this.val = val;
    }
    public String getId() {
        return id;
    }
    public String getVal() {
        return val;
    }
    public String toString() {
        return val;
    }
 
...
 
TableColumn KSTColumn = jTable_letzteDS.getColumnModel().getColumn(3);
        JComboBox KSTcomboBox = new JComboBox();
        KSTcomboBox.addActionListener(new java.awt.event.ActionListener() {
            public void itemStateChanged(java.awt.event.ActionEvent e) {
                read_id();
            }
        });
        KSTcomboBox.addItem(new Row("0", "111"));
        KSTcomboBox.addItem(new Row("1", "112"));
        KSTcomboBox.addItem(new Row("2", "211"));
        KSTcomboBox.addItem(new Row("3", "311"));
        KSTColumn.setCellEditor(new DefaultCellEditor(KSTcomboBox));
 
...
 
void read_id() {                                                // soll ID aus Tabelle lesen
        Row row = (Row) jTable_letzteDS.getValueAt(jTable_letzteDS.getSelectedRow(), 3);
	String id = row.getId(); // So komme ich hier an die ID 
}
Tschüß und nochmals Danke :toll:
 

Neue Themen


Zurück
Oben