У меня есть JTable, который использует пользовательский TableModel. Я расширил класс AbstractCellEditor, и ячейка корректно отображает текст, введенный в текстовое поле, когда я дважды щелкаю текстовое поле. но когда я просто одним щелчком выбираю ячейку в таблице и начинаю вводить текст, текстовое поле получает текст, но когда я нажимаю клавишу ввода, он не обновляет текстовое поле. Я подключил прослушиватель фокуса к текстовому полю для устранения неполадок и обнаружил, что он только выигрывает и теряет фокус при двойном щелчке по полю. С одним щелчком он не получает фокус (хотя он позволяет мне редактировать его). Это ошеломило мой разум! Я пробовал textField.grabFocus()
, textField.requestFocusInWindow()
и всевозможные другие вещи. Какие-либо предложения? Благодаря!JTextField не обновляется при нажатии клавиши
public class IndexerCellEditor extends AbstractCellEditor implements
TableCellEditor {
private JTextField textField;
private RecordValue currentValue;
public IndexerCellEditor(){
textField = new JTextField();
}
@Override
public boolean isCellEditable(EventObject e){
if(e instanceof MouseEvent){
return ((MouseEvent)e).getClickCount() >= 2;
}
return true;
}
@Override
public Object getCellEditorValue() {
return currentValue;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
textField.setBorder(BorderFactory.createLineBorder(Color.black, 1));
currentValue = (RecordValue) value;
textField.setText(currentValue.getValue());
textField.addFocusListener(new FocusListener(){
@Override
public void focusGained(FocusEvent e) {
System.out.println("focus gained");
}
@Override
public void focusLost(FocusEvent e) {
System.out.println("focus lost");
}
});
textField.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
currentValue.setValue(((JTextField)e.getSource()).getText());
fireEditingStopped();
}
});
return textField;
}
}
Для сравнения см. Этот полный [пример] (http://stackoverflow.com/a/10067560/230513). – trashgod
, потому что private RecordValue currentValue; имеет неправильный параметр (перегрузка), в строке 45. – mKorbel
@mKorbel анонимные внутренние классы имеют доступ к закрытым переменным (currentValue) своего внешнего класса. Кроме того, приведенный выше код работает корректно, когда я DOUBLE CLICK на ячейке (см. Метод 'isCellEditable()'). Я просто не знаю, почему actionevent не запускается, когда я нажимаю кнопку и начинаю вводить текст, а затем нажмите 'enter'. – ejsuncy