Чтобы сделать столбец редактируемым, вы должны переопределить метод isCellEditable
в TableModel
. Создать TableModel
довольно легко, если вы унаследуете AbstractTableModel
, и я бы порекомендовал его для всех, кроме самых простых JTable
s.
Однако адаптация TableModel
- это только часть того, что вам нужно сделать. Чтобы на самом деле получить пользовательский компонент в JTable
, вам нужно установить пользовательское средство визуализации ячеек. Чтобы использовать интерактивный пользовательский компонент, вам нужно установить пользовательский редактор ячеек. В некоторых случаях для этого достаточно использовать слегка модифицированные версии классов по умолчанию.
Редакторов
Если у вас уже есть пользовательский компонент, это легко сделать с помощью делегирования: создайте новый класс, реализующий TableCellEditor
, и верните новый экземпляр компонента в методе getCellEditorComponent
. Параметры этого метода включают текущее значение, а также координаты ячейки, ссылку на таблицу и выбирается ли ячейка или нет.
TableCellEditor
также имеет метод, который вызывается, когда пользователь фиксирует изменение содержимого ячейки (где вы можете проверить ввод данных пользователем и настроить модель) или отменяет редактирование. Обязательно вызовите метод stopEditing()
в вашем редакторе, если вы когда-либо программно прервете редактирование, в противном случае компонент редактора останется на экране - это однажды заняло у меня 2 часа для отладки.
Обратите внимание, что в редакторах JTable
и только редакторы получают события! Отображение кнопки может быть сделано с помощью рендерера. Но чтобы получить работающую кнопку, вам нужно реализовать редактор с правильным EventListeners
зарегистрированным. Регистрация слушателя на рендере ничего не делает.
Renderers
Реализация средства визуализации не является строго обязательной для того, что вы описываете в своем вопросе, но обычно вы в конечном итоге делаете это, хотя бы для незначительных изменений. Рендереры, в отличие от редакторов, критичны по скорости. getTableCellRendererComponent
средства визуализации вызывается один раз для каждой ячейки в таблице! Компонент, возвращаемый средством визуализации, используется только для рисования ячейки, а не для взаимодействия, и, таким образом, может быть "повторно использован" для Следующая клетка Другими словами, вы должны настроить компонент (например, используя setText(...)
или setFont(...)
, если это TextComponent
) в рендере, вы должны , а не создать новый - это простой способ урезать представление.
Предостережения
Обратите внимание, что для работы рендереров и редакторов необходимо указать JTable
, когда следует использовать определенный рендерер / редактор. Есть два основных способа сделать это. Вы можете установить рендерер / редактор ячеек по умолчанию для определенного типа , используя соответствующие методы JTable
. Для этого способа ваш TableModel
должен возвращать именно этот тип в методе getColumnClass(...)
! Модель таблицы по умолчанию не сделает это за вас, она всегда вернет Object.class
. Я уверен, что это поставило многих в тупик.
Другим способом установки редактора / средства визуализации является явная установка его в самом столбце, то есть получение TableColumn
с помощью метода getTableColumn(...)
из JTable
. Это намного сложнее, однако, это также единственный способ иметь два разных средства визуализации / редактирования для одного класса. Например. ваша модель может иметь два столбца класса String, которые отображаются совершенно разными способами, возможно, один раз с использованием JLabel/DefaultRenderer
, а другой - с помощью JButton
для доступа к более сложному редактору.
JTable
с его пользовательскими средствами визуализации и редакторами чрезвычайно универсален, но это также много, чтобы принять, и есть много вещей, которые нужно делать неправильно. Удачи!
Как использовать таблицы в Учебное пособие по Swing является обязательным чтением для всех, кто настраивает JTables. В частности, прочитайте и перечитайте Concepts: Editors and Renderers , потому что для его "щелчка" обычно требуется некоторое время. Примеры пользовательских рендеров и редакторов также очень полезны.