Редактируемый учебник по JTable - PullRequest
11 голосов
/ 17 сентября 2008

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

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

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

Ответы [ 6 ]

31 голосов
/ 20 сентября 2008

Чтобы сделать столбец редактируемым, вы должны переопределить метод 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 , потому что для его "щелчка" обычно требуется некоторое время. Примеры пользовательских рендеров и редакторов также очень полезны.

1 голос
/ 22 сентября 2008

Если вы пытаетесь использовать простой 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 голос
/ 17 сентября 2008

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

1 голос
/ 17 сентября 2008

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

0 голосов
/ 05 сентября 2016

в вашей модели таблицы, вы должны переопределить функции "isCellEditable" и "setValueAt", как показано ниже.
Столбец 4 - это столбец для редактируемых ячеек.
Затем, когда вы дважды щелкнете по ячейке и наберете что-нибудь,
Будет вызвана функция setValueAt () и сохранено значение в DO tableModel, поле 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 {
    }
}
0 голосов
/ 19 сентября 2008

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

Package javax.swing.table:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...