Редактируемый учебник JTable

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

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

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

Пожалуйста, перефразируйте вопрос, чтобы он не звучал не по теме ("Вопросы, просящие нас порекомендовать или найти книгу, инструмент, библиотеку программного обеспечения, учебное пособие или другой внешний ресурс, не по теме для Stack Overflow, поскольку они имеют тенденцию привлекать самоуверенные ответы и спам. Вместо этого опишите проблему и то, что было сделано на данный момент для ее решения »).

Cristian Ciupitu 28.12.2014 06:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
11
1
33 483
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

да, это след, на который я сейчас смотрю :) Мы уже расширили AbstractTableModel здесь раньше, и я знаю, что мне нужно переопределить getColumnClass и isCellEditable и все такое, у меня просто возникают проблемы со всем этим в редактируемых ячейках

Arthur Thomas 17.09.2008 20:47

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

Вот несколько полезных классов:

Package javax.swing.table:

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

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

Ответ принят как подходящий

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

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

Редакторы

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

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

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

Рендереры

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

Предостережения

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

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

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

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

Если вы пытаетесь использовать простой JTable с одним редактируемым столбцом и знаете расположение столбца, вы всегда можете использовать модель таблицы по умолчанию и перегрузить вызов 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

в вашей модели таблицы вы должны переопределить функции 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 {
    }
}

Другие вопросы по теме