Вопрос

Есть ли какие-нибудь хорошие книги или веб-сайт, в которых рассказывается о создании JTable?Я хочу сделать один столбец доступным для редактирования.Я бы хотел на самом деле поместить унаследованный JCheckBox компонент (который мы создали здесь) в один из столбцов таблицы вместо того, чтобы просто помещать таблицу JCheckBox в зависимости от того, что это редактируемый boolean поле.

У меня есть JFC Swing Tutorial Второе Издание но я просто хотел бы знать, есть ли другие примеры, на которые я мог бы взглянуть и научиться лучше обращаться с таблицами.Книга, похоже, просто берет "след" java онлайн и помещает его в книгу.

Однако я перечитываю этот материал, просто любопытно, нашел ли кто-нибудь что-нибудь, что могло бы помочь больше.

Это было полезно?

Решение

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

Однако, адаптируя 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 {
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top