Пользовательский редактор ячеек не может разместить текст во внешнем виде Nimbus

#java #swing #jtable #look-and-feel #tablecelleditor

#java #swing #jtable #внешний вид #tablecelleditor

Вопрос:

Я хочу проверить вводимые пользователем данные в ячейке таблицы, и я использую внешний вид Nimbus. Вот код редактора ячеек, который проверяет целочисленный ввод: WholeNumberField Он расширяет JTextField и добавляет проверку ввода.

Когда я устанавливаю его для столбца, он работает нормально, но не может вместить текст:

вырезание текста

Когда я использую редактор ячеек по умолчанию, все выглядит нормально:

обычный вид

Как я могу сделать этот редактор похожим на редактор по умолчанию?

Комментарии:

1. по умолчанию JTable возвращает JLabel в качестве средства визуализации и JTextField в качестве редактора

2. @mKorbel — нет, строго говоря, это неверно: а) «default» зависит от класса столбца, б) DefaultTableCellRenderer, являющийся JLabel, является плохим дизайном (хотя на самом деле случай случайно имеет место для core JTable :-), в) DefaultCellEditor — не JTextField, он может возвращатьJTextField (если он создан с одним экземпляром) в качестве компонента редактирования

Ответ №1:

WholeNumberField — это старый код. Если вы действительно хотите выполнить пользовательскую проверку, вам следует использовать DocumentFilter.

Однако в этом случае нет необходимости создавать пользовательский редактор. JTable уже поддерживает редактор для проверки чисел. Вам просто нужно переопределить isCellEditable(...) метод JTable или TableModel для возврата Integer.Class , и будут использоваться надлежащие средства визуализации и редактор.

Редактировать: только что заметил, что мое предложение неверно.

  1. вам нужно переопределить getColumnClass(...) , чтобы вернуть Integer.class таким образом, можно использовать соответствующий рендерер / редактор.
  2. этот isCellEditable(...) метод используется для определения, можно ли редактировать ячейку.

Комментарии:

1. Я переопределяю getColumnClass(int ColumnIndex) в TableModel, и теперь это работает! Спасибо. (isCellEditable возвращает логическое значение)

Ответ №2:

Я обнаружил, что добавление следующего в мой пользовательский конструктор редактора ячеек решило проблему для меня:

 Border border = UIManager.getBorder("Table.cellNoFocusBorder");
if (border != null) {
    setBorder(border);
}
  

Мой редактор расширяет JTextField.

Ответ №3:

Если вы получаете экземпляр TableCellEditor from getDefaultEditor(Object.class) , он уже должен быть компонентом, который вы можете проверить, как в вашем примере.

Комментарии:

1. нет. а) предполагая, что с помощью getDefaultEditor() вы имеете в виду table.getDefaultEditor(someclass), вы не получаете «копию» редактора, вы получаете реальную вещь б) редактор редко является JTextField, все реализации по умолчанию возвращают определенный тип JComponent в качестве компонента редактирования в) точный типкомпонент редактирования может быть любым, тот, который возвращается для Object.class действительно, это JTextField, случайно 😉