Редактируемый учебник по JTable
Вопрос
Есть ли какие-нибудь хорошие книги или веб-сайт, в которых рассказывается о создании JTable
?Я хочу сделать один столбец доступным для редактирования.Я бы хотел на самом деле поместить унаследованный JCheckBox
компонент (который мы создали здесь) в один из столбцов таблицы вместо того, чтобы просто помещать таблицу JCheckBox
в зависимости от того, что это редактируемый boolean
поле.
У меня есть JFC Swing Tutorial Второе Издание но я просто хотел бы знать, есть ли другие примеры, на которые я мог бы взглянуть и научиться лучше обращаться с таблицами.Книга, похоже, просто берет "след" java онлайн и помещает его в книгу.
Однако я перечитываю этот материал, просто любопытно, нашел ли кто-нибудь что-нибудь, что могло бы помочь больше.
Решение
Чтобы сделать столбец доступным для редактирования, вы должны переопределить isCellEditable
метод в TableModel
.Создание TableModel
это довольно легко, если вы унаследуете AbstractTableModel
и я бы рекомендовал это для всех, кроме самых простых JTable
s.
Однако, адаптируя TableModel
это только часть того, что вам нужно сделать.Чтобы на самом деле получить пользовательский компонент в JTable
, вам нужно установить пользовательский рендеринг ячеек.Чтобы использовать интерактивный пользовательский компонент, вам необходимо настроить пользовательский редактор ячеек.В некоторых случаях для этого достаточно использовать слегка измененные версии классов по умолчанию.
Редакторы
Если у вас уже есть пользовательский компонент, это легко сделать с помощью делегирования:Создайте новый класс, реализующий TableCellEditor
, и верните новое экземпляр компонента в getCellEditorComponent
способ.Параметры этого метода включают текущее значение, а также координаты ячейки, обратную ссылку на таблицу и то, выбрана ячейка или нет.
Тот Самый TableCellEditor
также имеет метод, который вызывается, когда пользователь вносит изменения в содержимое ячейки (где вы можете проверить введенные пользователем данные и скорректировать модель) или отменяет редактирование.Обязательно позвоните в stopEditing()
метод в вашем редакторе, если вы когда-либо программно прервете редактирование, в противном случае компонент editor останется на экране - однажды мне потребовалось около 2 часов на отладку.
Обратите внимание , что в пределах JTable
редакторы и Только редакторы получают события!Отображение кнопки может быть выполнено с помощью средства визуализации.Но чтобы получить работающую кнопку, вам нужно реализовать редактор с правильным EventListeners
зарегистрирован.Регистрация слушателя в средстве визуализации ничего не дает.
Средства визуализации
Реализация средства визуализации не является строго необходимой для того, что вы описываете в своем вопросе, но вы, как правило, в конечном итоге делаете это в любом случае, хотя бы для незначительных изменений.Средства визуализации, в отличие от редакторов, имеют решающее значение для скорости. Тот Самый getTableCellRendererComponent
средство визуализации вызывается один раз для каждой ячейки в таблице! Компонент, возвращаемый средством визуализации, используется только для рисования ячейки, а не для взаимодействия, и, таким образом, может быть "повторно использован" для следующей ячейки.Другими словами, вы должны настроить компонент (например,используя setText(...)
или setFont(...)
если это TextComponent
) в программе визуализации вы должны нет создать новый экземпляр - это простой способ снизить производительность.
Предостережения
Обратите внимание, что для работы средств визуализации и редакторов вам необходимо указать JTable
когда следует использовать определенный рендерер / редактор.В принципе, есть два способа сделать это.Вы можете установить средство визуализации ячеек по умолчанию / редактор для определенного типа используя соответствующие JTable
методы.Чтобы этот способ работал, ваш TableModel
должен возвращать именно этот тип в getColumnClass(...)
метод!Табличная модель по умолчанию будет нет сделай это для себя, это всегда возвращается Object.class
.Я уверен, что это поставило в тупик многих людей.
Другой способ установить редактор / средство визуализации - это явно установить его в самом столбце, то есть получить TableColumn
через getTableColumn(...)
способ проведения JTable
.Это намного сложнее, однако, это также единственный способ иметь два разных средства визуализации / редактора для одного класса.Например.ваша модель может содержать два столбца class String, которые отображаются совершенно по-разному, возможно, один раз с использованием JLabel/DefaultRenderer
а другой, использующий JButton
чтобы получить доступ к более сложному редактору.
JTable
с его пользовательскими средствами визуализации и редакторами чрезвычайно универсален, но в то же время требует принятия многих мер, и есть много вещей, которые можно сделать неправильно.Удачи вам!
Как использовать таблицы в Учебное пособие по Swing является обязательным чтением для всех, кто настраивает JTables.В частности, читать и перечитывать Концепции:Редакторы и средства визуализации потому что обычно требуется некоторое время, чтобы он "щелкнул".Примеры пользовательских средств визуализации и редакторов также очень полезны.
Другие советы
Класс, который вы хотите расширить, чтобы создать свое собственное поведение, - DefaultTableModel .Это позволит вам определить свое собственное поведение.Достойный учебник можно найти на сайте sun.
Этот учебник из java-лобби за этим легко следить.Онлайн Поворотная дорожка для JTable то, на что вы ссылаетесь, указывает на то, что оно было обновлено.Вы просмотрели все это в поисках возможной лучшей (разве новее не всегда лучше) информации?
Если вы пытаетесь использовать простой 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
Вот некоторые полезные классы:
Package javax.swing.table
:
TableModel
- Интерфейс для tablemodel
AbstractTableModel
- Хороший класс для расширения для создания вашей собственной таблицы с пользовательскими структурами данных
DefaultTableModel
- Модель таблицы по умолчанию, которая может иметь дело с arrays[]
и Vectors
Чтобы отключить редактирование для любой ячейки, вам необходимо переопределить isCellEditable(int row, int col)
способ
в вашей табличной модели вы должны переопределить функции "isCellEditable" и "setValueAt", как показано ниже.
Столбец 4 - это столбец для редактируемых ячеек.
Затем, когда вы дважды щелкните ячейку и введите что-нибудь,
Будет вызвана функция setValueAt(), которая сохранит значение в поле DO табличной модели col4.
public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table
@Override
public boolean isCellEditable(int row, int col) {
if (col == 4) {
return true;
} else {
return false;
}
}
@Override
public void setValueAt(Object value, int row, int col) {
if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) {
if (col == 4) {
tbmData.get(row).col4= (String) value;
}
fireTableCellUpdated(row, col);
} else {
}
}