Доступное для редактирования учебное руководство JTable

Вы не можете ссылаться на сам документ в обновлении (пока). Вам нужно будет перебирать документы и обновлять каждый документ с помощью функции. См. этот ответ для примера, или этот для серверной стороны eval().

11
задан Lahiru Ashan 24 November 2016 в 12:02
поделиться

5 ответов

Для создания столбца доступным для редактирования, необходимо переопределить isCellEditable метод в TableModel. Создание a TableModel довольно легко, если Вы наследовались AbstractTableModel и я рекомендовал бы это для всех кроме самого простого JTables.

Однако адаптация TableModel только часть того, что необходимо сделать. На самом деле вкладывать пользовательский компонент JTable, необходимо установить пользовательский рендерер ячейки. Для использования интерактивного пользовательского компонента необходимо установить пользовательского редактора ячейки. В некоторых случаях достаточно использовать немного modificated версии классов по умолчанию для этого.

Редакторы

Если у Вас уже есть пользовательский компонент, легко сделан с помощью делегации: Создайте новую реализацию класса TableCellEditor, и возвратите новый экземпляр компонента в getCellEditorComponent метод. Параматери к этому методу включают текущее значение, а также координаты ячейки, ссылка назад на таблицу и выбрана ли ячейка.

TableCellEditor также имеет метод, который называют, когда пользователь передает изменение в содержании ячейки (где можно проверить ввод данных пользователем и скорректировать модель), или отменяет редактирование. Обязательно звоните stopEditing() метод на Вашем редакторе, если Вы когда-нибудь программно прерываете редактирование, иначе компонент редактора, останется на экране - это однажды взяло меня как 2 часа для отладки.

Отметьте это в a JTable редакторы и только редакторы получают события! Отображение кнопки может быть сделано с помощью рендерера. Но получить функционирующую кнопку, необходимо реализовать редактора с корректным EventListeners зарегистрированный. Регистрация слушателя на рендерере ничего не делает.

Рендереры

Реализация рендерера не строго необходима для того, что Вы описываете в своем вопросе, но Вы обычно заканчиваете тем, что делали его так или иначе, если только для незначительных модификаций. Рендереры, в отличие от редакторов, являются очень важной скоростью. getTableCellRendererComponent из рендерера назван однажды для каждой ячейки в таблице! Компонент, возвращенный рендерером, только используется для рисования ячейки, не для взаимодействия, и таким образом может быть "снова использован" для следующей ячейки. Другими словами, необходимо скорректировать компонент (например, использование setText(...) или setFont(...) если это - a TextComponent) в рендерере Вы не должны инстанцировать нового - это - простой способ нанести вред производительности.

Протесты

Обратите внимание, что для рендереров и редакторов для работы необходимо сказать JTable когда использовать определенный рендерер/редактора. Существует в основном два способа сделать это. Можно установить рендерер/редактора ячейки по умолчанию для определенного типа с помощью соответствующего JTable методы. Для этого способа работать, Ваш TableModel потребности возвратить точно это вводят getColumnClass(...) метод! Модель таблицы по умолчанию не сделает этого для Вас, она всегда возвращается Object.class. Я уверен, что каждый озадачил много людей.

Другой способ установить редактора/рендерер путем явной установки его на самом столбце, то есть, путем получения TableColumn через getTableColumn(...) метод JTable. Это намного более тщательно продумано, однако, это - также единственный способ иметь два различных рендерера/редакторов для единого класса. Например, Ваша модель могла бы иметь два столбца класса Строка, которые представляются совершенно различными способами, возможно, однажды использующий a JLabel/DefaultRenderer и другое использование a JButton получить доступ к более тщательно продуманному редактору.

JTable с его пользовательскими рендерерами и редакторами чрезвычайно универсально, но это также много для принятия, и существует много вещей сделать неправильно.Удачи!

То, как Использовать Таблицы в Учебном руководстве Swing, является обязательным чтением для любого настраивающего JTables. В частности, считайте и перечитайте Понятия: Редакторы и Рендереры, потому что это обычно требует времени, чтобы это "нажало". Примеры на пользовательских рендерерах и редакторах также очень стоят.

31
ответ дан 3 December 2019 в 02:12
поделиться

Классом Вы хотите изучить расширение для создания собственного поведения, является DefaultTableModel. Это позволит Вам определять свое собственное поведение. Достойное учебное руководство может быть найдено на сайте солнца.

1
ответ дан 3 December 2019 в 02:12
поделиться

Этому учебному руководству от лобби Java легко следовать. След Swing онлайн для JTable, на который Вы ссылаетесь, указывает, что был обновлен. Вы сканировали через все это для возможного лучше (не является более новым всегда лучше), информация?

1
ответ дан 3 December 2019 в 02:12
поделиться

При попытке использовать простое JTable с доступным для редактирования 1 столбцом и Вы знаете местоположение столбца, Вы могли всегда использовать модель таблицы по умолчанию и перегружаться isCellEditable звонить.

что-то вроде этого:

myTable.setModel(new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int column) {
    if (column == x) {
        return true;
    } else
        return false;
}
});

И поскольку флажок создают класс рендерера

MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer
1
ответ дан 3 December 2019 в 02:12
поделиться

Некоторые полезные классы:

Package javax.swing.table :

TableModel - Интерфейс для a tablemodel AbstractTableModel - Хороший класс для расширения для того, чтобы составить собственную таблицу с пользовательскими структурами данных DefaultTableModel - Модель таблицы по умолчанию, которая может иметь дело с arrays[] и Vectors

Для отключения редактирования на любой ячейке, необходимо переопределить isCellEditable(int row, int col) метод

0
ответ дан 3 December 2019 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: