Win an den DataVector des DefaultTableModels kommen

may24

Bekanntes Mitglied
Hi,

ich lasse mir die Position einer "Zelle" eines JTables augeben und versuche anhand dieser X/Y Koordinaten den nun neu eingegebenen Text aus dieser Zelle zu lesen.

Das DefaultTableModel besitzt:
1. Vector <E> columnIdentifiers
2. Vector <E> dataVector
3. EventListenerList listenerList

Was hier interessant ist sind die daten im dataVector. Nur wie da ran kommen ?

getValueAt liefert nur daten aus columnIdentifiers oder eine "out of Bounds" Exception
ein getDataVector().elementAt(y) liefert mir zwar die korrekte Zeile, aber diese nur als Object (nicht etwa als Vector oder Array). Und dann habe ich das Problem die (Zelle an) Stelle X auszulesen. Denn elementAt(X) kann man nicht auf das Object machen.

Jemand 'ne Idee ?
 

KrokoDiehl

Top Contributor
Hm? Das TableModel hat doch alles um an die Daten zu kommen:
Code:
getValueAt(row, column)
ist das was du brauchst. Mit
Code:
getRowCount()
und
Code:
getColumnCount()
kannst du herauslesen wie viele Zeilen/Spalten dein Modell hat.

Vom dataVector lässt du besser die Finger, weil das nur die interne Datenhaltung vom DefaultTableModel ist.

Sonst zeigt mal etwas Code...
 

may24

Bekanntes Mitglied
@SlaterB: Ich brauche nicht nur die Zeile (definiert duch Y) sondern auch die Zelle (definiert durch X)

@KrokoDiehl: Den ganzen Code hier zu posten wäre etwas viel ...
und wie schon gesagt,
Code:
getValueAt(row, column)
angewand auf das DefaultTableModel liefert Daten aus columnIdentifiers. Das ist natürlich nichts mit dem ich was anfangen kann.
Die Informationen über RowCount und ColumnCount habe ich ja bereits duch ListSelectionModel ...

EDIT: nach einigem ausprobieren bin ich nun etwas weiter gekommen ...

Java:
Object cellValue = ((Vector<Object[]>) dtm.getDataVector().elementAt(y).elementAt(x);

... das liefert mir tatsächlich das Object gemäß X/Y Adressierung. Aber ich gebe KrokoDiehl da recht, ob das so ok ist mit dem "anzapfen" des dataVector bin ich mir auch nicht sicher.
Gibt's denn da keine ... sagen wir mal "elegantere" Lösung ?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> @SlaterB: Ich brauche nicht nur die Zeile (definiert duch Y) sondern auch die Zelle (definiert durch X)

wie du selbst schon hast ist ja klar dass es von der Zeile noch weiter gehen muss

> getValueAt(row, column)
> angewand auf das DefaultTableModel liefert Daten aus columnIdentifiers.

das kann auf keinen Fall sein,
prüfe folgendes:
Java:
Object cellValue1 = ((Vector<Object[]>) dtm.getDataVector().elementAt(xy[1])).elementAt(xy[0]);
Object cellValue2 = dtm.getValueAt(xy[1],xy[0]);
System.out.println("selber Wert? "+(cellValue1 == cellValue2));
da sollte true rauskommen, sonst wirklich was zum Nachdenken

edit: besonders noch wenn man die interne Implementierung von getValueAt anschaut..
Java:
    public Object getValueAt(int row, int column) {
        Vector rowVector = (Vector)dataVector.elementAt(row);
        return rowVector.elementAt(column);
    }

    public Vector getDataVector() {
        return dataVector;
    }
 

may24

Bekanntes Mitglied
Hm, ich habe dein Beispiel nochmal nachgetestet und nun funktioniert es.
Ich kann es mir nur so erklähren das ein Tablechange Event feuert bevor überhaupt was im dtm war ...
Schon sehr merkwürdig ... aber es geht jetzt :)
 

Ähnliche Java Themen

Neue Themen


Oben