G
Guest
Gast
Hallo,
ich habe hier eine JTable, der ich eine JComboBox als Editor für eine Spalte mitgebe.
Der JComboBox habe einen ItemListener verpasst um auf das Wechseln des Wertes reagieren zu können.
Wenn ich nun auf die entsprechenden Zellen (mit der JComboBox) klicke und mir im ItemListener der JComboBox die selektierte Zeile ausgeben lasse, dann bekomme ich immer die vorherige Zeile, aber nicht die aktuell selektierte Zeile ausgegeben.
Warum ist das so? Bzw. wie komme ich in dem Moment an die richtige Zeile?
Hintergrund ist der, dass ich in der ersten Zelle (nicht sichtbar) ein Objekt habe, dessen Eigenschaften ich entsprechend setzen möchte, nur bei der falschen Reihe ändere ich dann natürlich auch das falsche Objekt.
Hier mal mein Testcode (ohne das Objekt), beinhaltet nur das Setzen des TableModels:
In dem hinzugefügten ListSelectionListener erhalte ich mit e.getFirstIndex() allerdings die richtige Zeile. Nur wird das Event immer erst nach dem der JComboBox ausgeführt.
Gruß Björn
ich habe hier eine JTable, der ich eine JComboBox als Editor für eine Spalte mitgebe.
Der JComboBox habe einen ItemListener verpasst um auf das Wechseln des Wertes reagieren zu können.
Wenn ich nun auf die entsprechenden Zellen (mit der JComboBox) klicke und mir im ItemListener der JComboBox die selektierte Zeile ausgeben lasse, dann bekomme ich immer die vorherige Zeile, aber nicht die aktuell selektierte Zeile ausgegeben.
Warum ist das so? Bzw. wie komme ich in dem Moment an die richtige Zeile?
Hintergrund ist der, dass ich in der ersten Zelle (nicht sichtbar) ein Objekt habe, dessen Eigenschaften ich entsprechend setzen möchte, nur bei der falschen Reihe ändere ich dann natürlich auch das falsche Objekt.
Hier mal mein Testcode (ohne das Objekt), beinhaltet nur das Setzen des TableModels:
Code:
private void setModel() {
DefaultTableModel dtm = null;
Vector vCols = new Vector();
vCols.addElement("Spalte1");
vCols.addElement("Spalte2");
vCols.addElement("Spalte3");
vCols.addElement("Spalte4");
vCols.addElement("Spalte5");
Vector vRows = new Vector();
for (int i = 0; i < 10; i++) {
Vector vTmp = new Vector();
for (int j = 0; j < 5; j++) {
vTmp.addElement(String.valueOf(i)+"-"+String.valueOf(j));
}
vRows.addElement(vTmp);
}
dtm = new DefaultTableModel(vRows, vCols);
tblTest.setModel(dtm);
JComboBox cbTest = new JComboBox();
cbTest.setFont(new Font("Dialog", Font.PLAIN, 11));
cbTest.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
System.out.print("row:");
System.out.print(tblTest.getSelectedRow());
System.out.print("=>itemStateChanged():");
System.out.print(e.getItem()+":");
System.out.print(e.getStateChange());
if (e.getStateChange() == e.DESELECTED)
System.out.println("(DESELECTED)");
else
System.out.println("(SELECTED)");
}
});
cbTest.addItem("0-1");
cbTest.addItem("1-1");
cbTest.addItem("2-1");
cbTest.addItem("3-1");
cbTest.addItem("4-1");
cbTest.addItem("5-1");
cbTest.addItem("6-1");
cbTest.addItem("7-1");
cbTest.addItem("8-1");
cbTest.addItem("9-1");
DefaultCellEditor dce = new DefaultCellEditor(cbTest);
tblTest.getSelectionModel().addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
System.out.println(e.getFirstIndex()+":"+e.getLastIndex());
tblTest.setRowSelectionInterval(e.getFirstIndex(), e.getFirstIndex());
}
});
tblTest.getColumnModel().getColumn(1).setCellEditor(dce);
}
In dem hinzugefügten ListSelectionListener erhalte ich mit e.getFirstIndex() allerdings die richtige Zeile. Nur wird das Event immer erst nach dem der JComboBox ausgeführt.
Gruß Björn