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