#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
, и будут использоваться надлежащие средства визуализации и редактор.
Редактировать: только что заметил, что мое предложение неверно.
- вам нужно переопределить
getColumnClass(...)
, чтобы вернуть Integer.class таким образом, можно использовать соответствующий рендерер / редактор. - этот
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, случайно 😉