Установка StopCellEditing в ячейке JTable не останавливает редактирование при щелчке в JTextField - PullRequest
0 голосов
/ 14 января 2019

В моем коде у меня есть несколько JTextFields, а также отдельный JTable с несколькими столбцами и строками. Я хочу проверить определенную ячейку в моей таблице, и если она недействительна, не позволяйте пользователю перемещать курсор в другое поле. Мой код работает правильно, если пользователь перемещает курсор в другую ячейку таблицы (другую строку или столбец), но если я перемещаю курсор в другое поле формы, курсор перемещается. Я проверил, что моя функция stopCellEditing вызывается и возвращает false. Я делаю границу красной, когда она недействительна. Это работает правильно и, как и ожидалось, просто курсор движется. Вот мой код.

Редактор ячеек, используемый для соответствующего столбца, устанавливается с помощью

    // Set up the verifier to make sure the user has entered a valid value
    statusTable.getColumn(statusTable.getColumnName(1)).
            setCellEditor(new CellEditor(new SvidVerifier(), this));

И мой расширенный DefaultCellEditor

class CellEditor extends DefaultCellEditor {

  InputVerifier verifier = null;
  ModView view = null;

  public CellEditor(InputVerifier verifier, ModView view) {
    super(new JTextField());
    this.verifier = verifier;
    this.view = view;
  }

  @Override
  public boolean stopCellEditing() {
    if (KeyboardFocusManager.getCurrentKeyboardFocusManager().
            getFocusOwner() == view.publicBrowseButton) {
      super.cancelCellEditing();
      return true;
    }
    boolean canStop = verifier.verify(editorComponent) &&
            super.stopCellEditing();
    return canStop;
  }
}

и мой верификатор

class IdVerifier extends InputVerifier {
  @Override
  public boolean verify(JComponent input) {
    JTextField tf = (JTextField) input;
    try {
      if ((Integer.parseInt(tf.getText()) >= 1) &&
              (Integer.parseInt(tf.getText()) <= 32)) {
        tf.setBorder(new LineBorder(
                UIManager.getColor("activeCaptionBorder")));
        return true;
      } else {
        tf.setBorder(new LineBorder(Color.RED));
        return false;
      }
    } catch (Exception ex) {
      tf.setBorder(new LineBorder(Color.RED));
      return false;
    }
  }
}

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Используя статью, на которую указал @camickr, я смог успешно выполнить то, что мне нужно, и решить мою проблему с помощью функции TextField.requestFocusInWindow().

0 голосов
/ 14 января 2019

На мой взгляд, таблице сказано прекратить редактирование, но не более того. В интерфейсе CellEditor не упоминается обработка фокуса для stopCellEditing .

Возможно, вам придется привязать слушателя фокуса к другим компонентам формы и в этом слушателе проверить, был ли предыдущий фокус на столе. Если это так, и таблица все еще редактирует, верните фокус на таблицу.

...