Cześć wszystkim,
problem dotyczy TableCellEditor w JTable. O co chodzi:
Mam tabelkę JTable i chcę mieć w niej swój edytor wartości komórki. Utworzyłem dlatego klasę:
public class TimeCellEditor extends AbstractCellEditor implements TableCellEditor{
String value;
TimeEditor te;
public TimeCellEditor() {
super();
te = new TimeEditor();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
TableModel tm = table.getModel();
te.setText(""+tm.getValueAt(row, column));
return te;
}
@Override
public Object getCellEditorValue() {
return te.getText();
}
}
oraz zrobiłem komponent TimeEditor rozszerzający JTextField:
public class TimeEditor extends JTextField implements KeyListener, FocusListener {
public TimeEditor() {
super();
this.addFocusListener(this);
this.addKeyListener(this);
}
TimeEditor(String text) {
super(text);
this.addFocusListener(this);
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
System.out.println("X");
if (e.getKeyChar() >= '0' && e.getKeyChar() <= '9') {
int caret = this.getCaretPosition();
if (caret > 4) {
caret = 4;
}
if (caret == 2)
caret++;
StringBuilder sb = new StringBuilder(this.getText());
sb.setCharAt(caret, e.getKeyChar());
this.setText(sb.toString());
this.setCaretPosition(caret+1);
}
e.consume();
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyChar() == KeyEvent.VK_BACK_SPACE) {
int caret = this.getCaretPosition();
if (caret > 0)
caret--;
if (caret == 2) {
caret = 1;
}
StringBuilder sb = new StringBuilder(this.getText());
sb.setCharAt(caret, '_');
this.setText(sb.toString());
this.setCaretPosition(caret);
e.consume();
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void focusGained(FocusEvent e) {
this.setCaretPosition(0);
}
@Override
public void focusLost(FocusEvent e) {
}
}
Zarejestrowałem edytory:
jtTimeWindows.getColumnModel().getColumn(0).setCellEditor(new TimeCellEditor());
jtTimeWindows.getColumnModel().getColumn(1).setCellEditor(new TimeCellEditor());
Jeżeli do uruchomienia edycji komórki używam myszki, wszystko działa poprawnie. Odpala się edytor TimeEditor. Problemy pojawiają się jak chcę rozpocząć edycję z klawiatury. Zaznaczając komórkę i wciskając "backspace"(lub F2 lub literkę) uruchamia się domyślny edytor JTextField.
Może mi ktoś pomóc w tym, jak zrobić, aby ten sam edytor uruchamiał się po kliknięci i po interakcji z klawiatury?