Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Редакторы

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

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

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

рендерерами

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

Если вы пытаетесь использовать простой 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

Ответ 5

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

Package javax.swing.table:

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

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

Ответ 6

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