Запретить редактору ячеек JTable выходить из «режима редактирования» при ошибке проверки - PullRequest
2 голосов
/ 18 марта 2011

Я хотел бы получить следующее поведение в JTable:

  • пользователь начинает редактировать ячейку - ячейка переключается на JTextField как обычно;
  • , когда пользователь вкладываетили щелкает в другой ячейке. Я хотел бы проверить ввод и дать визуальную подсказку, когда проверка не удалась (например, изменить цвет фона JTextField), и препятствовать фиксации ячейки И переключению обратно на средство визуализации по умолчанию.(JLabel).

Пока что я переопределил DefaultCellEditor.Я могу подключиться к getCellEditorValue и выполнить там проверку, но я не знаю, как предотвратить возвращение ячейки в средство визуализации по умолчанию.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

Вот как я сделал это для проверки только для числовых данных. Он будет окрашен в красный цвет при сбое проверки.

column.setCellEditor(new DefaultCellEditor(new JTextField()){

  @Override
  public Object getCellEditorValue() {
    // throws exception if parsing failes, and it's catched on stopCellEditing
    return  Integer.parseInt((String) super.getCellEditorValue());
  }

  @Override
  public boolean stopCellEditing() {

    boolean result = false;

    try{
      result = super.stopCellEditing();
      ((JTextField)getComponent()).setBackground(Color.WHITE);
    }catch (NumberFormatException e) {
      ((JTextField)getComponent()).setBackground(Color.RED);
      result = false;
    }

    return result;
  }

  @Override
  public boolean isCellEditable(EventObject anEvent) {
    // reset color when begin editing
    ((JTextField)getComponent()).setBackground(Color.WHITE);
    return super.isCellEditable(anEvent);
  }
});
3 голосов
/ 18 марта 2011

А как насчет метода JTable editStopped ()? Смотри также

/**
        * Stops editing and
        * returns true to indicate that editing has stopped.
        * This method calls <code>fireEditingStopped</code>.
        *
        * @return  true 
        */         
     public boolean stopCellEditing() { 
        fireEditingStopped(); 
        return true;
    }

в DefaultCellEditor

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...