Hallo,
ich benutze folgenden TableCellEditor, um zu erreichen, dass beim Editieren einer Zelle der gesamte Inhalt markiert wird und bei Eingabe direkt überschrieben werden kann:
Dies funktioniert auch soweit, ich per Mausclick die Zelle zum editieren öffne. Nun wollte ich aber, dass beim Durchlaufen der Zellen per Tabulator der gleiche Effekt eintritt. Also habe ich ein KeyHandler für die JTable eingefügt:
Nun wird das Markieren des Textes in der Zelle nicht mehr angezeigt, auch wenn sie sich trotzdem genauso verhält. Was mache ich falsch?
ich benutze folgenden TableCellEditor, um zu erreichen, dass beim Editieren einer Zelle der gesamte Inhalt markiert wird und bei Eingabe direkt überschrieben werden kann:
Java:
public class MyEditor implements TableCellEditor {
private JTextField textField = new JTextField();
/** Observer des Editors */
private List<CellEditorListener> listeners = new ArrayList<CellEditorListener>();
// Prepariert den Editor, so dass ein neuer Wert angezeigt wird.
public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column ){
textField.setText( String.valueOf( value ));
SwingUtilities.invokeLater(new Runnable(){
public void run(){
textField.selectAll();
}
});
return textField;
}
public void addCellEditorListener( CellEditorListener l ){
listeners.add( l );
}
public void removeCellEditorListener( CellEditorListener l ){
listeners.remove( l );
}
// Gibt den aktuellen Wert des Editors zurück.
public Object getCellEditorValue(){
return Double.parseDouble(textField.getText());
}
public boolean isCellEditable( EventObject anEvent ){
return true;
}
public boolean shouldSelectCell( EventObject anEvent ){
return true;
}
// Informiert alle Observer, dass die Aktion abgebrochen wurde.
public void cancelCellEditing(){
ChangeEvent event = new ChangeEvent( this );
for( CellEditorListener listener :
listeners.toArray( new CellEditorListener[ listeners.size() ] )){
listener.editingCanceled( event );
}
}
// Informiert alle Observer, dass der Wert gespeichert werden soll.
public boolean stopCellEditing(){
ChangeEvent event = new ChangeEvent( this );
for( CellEditorListener listener :
listeners.toArray( new CellEditorListener[ listeners.size() ] )){
listener.editingStopped( event );
}
// informiert den Aufrufer, dass der Input korrekt ist.
return true;
}
}
Java:
pointstable.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
JTable table =(JTable) e.getSource();
if(e.getKeyCode() == KeyEvent.VK_TAB) {
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
if (table.isCellEditable(row, col)) {
table.editCellAt(row,col);
}
}
}
});
Nun wird das Markieren des Textes in der Zelle nicht mehr angezeigt, auch wenn sie sich trotzdem genauso verhält. Was mache ich falsch?