2008-09-17 4 views
11

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

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

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

+0

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

ответ

31

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

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

Редакторы

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

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

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

Renderers

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

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

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

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

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

How to Use Tables в The Swing Tutorial является обязательным для чтения для любого, настраивающего JTables. В частности, читать и перечитывать Concepts: Editors and Renderers, потому что для этого обычно требуется некоторое время, чтобы «щелкнуть». Примеры для индивидуальных рендерингов и редакторов также очень полезны.

+0

wow , много информации. спасибо. –

+0

Пару лет поздно, но отличный ответ. Спасибо! – imiric

1

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

+0

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

1

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

0

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

Package javax.swing.table:

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

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

1

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

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