JTable — использование TableModel




Парадигма Модель-Вид-Контроллер позволяет разделить весь код на несколько больших фукциональных блоков, код которых отделен максимально друг от друга. Основной принцип — разделяй и властвуй.

Компоненты, такие как JTable, внутри себя разделяют код, который занимается только отрисовкой и код, который занимается поставкой данных для отрисовки.

Для JTable данные поставляются моделью TableModel. TableModel — это интерфейс, который должна реализовать реализация модели для JTable.

Данные из базы получаются в виде набора неких сущностей со своими полями. Требуется в JTable отобразить список таких сущностей. Тогда целесообразно реализовать свою модель TableModel и «настроить» её на сущности.


Пример: имеется список сущностей MyBean.

public class MyBean { private String name; private String size; private String description; public MyBean(String name, String size, String description) { this.setName(name); this.setSize(size); this.setDescription(description); } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setSize(String size) { this.size = size; } public String getSize() { return size; } public void setDescription(String description) { this.description = description; } public String getDescription() { return description; } }}

Необходимо отобразить данный список в JTable при помощи TableModel.

Какие методы необходимо реализовать у интерфейса TableModel:

Первые два метода addTableModelListener и removeTableModelListener добавляют и удаляют слушателей модели.

private Set<TableModelListener> listeners = new HashSet<TableModelListener>(); public void addTableModelListener(TableModelListener listener) { listeners.add(listener);} public void removeTableModelListener(TableModelListener listener) { listeners.remove(listener);}

 

Метод getColumnClass. (Все поля строковые)

public Class<?> getColumnClass(int columnIndex) { return String.class;}

Метод getColumnCount возвращает количество столбцов которое будет отобрахаться в таблице. (В MyBean 3 поля, значит и возвращать метод будет число 3).

public int getColumnCount() { return 3;}

Метод getColumnName возвращает заголовок колонки по её индексу. (В примере три поля, три колонки) Внутри метода проверяем индекс и возвращаем соответствующее имя колонки.

public String getColumnName(int columnIndex) { switch (columnIndex) { case 0: return "Имя"; case 1: return "Размер"; case 2: return "Описание"; } return "";}

Метод getRowCount возвращает количество строк, которое будет отображаться в таблице. Здесь beans это список. Чтобы JTable знал количество строк, которое нужно показать достаточно получить из beans размер.

public int getRowCount() { return beans.size();}

Метод getValueAt отвечает за то, какие данные в каких ячейках JTable будут показываться. Методу в качестве параметров передаетяс индекс строки и столбца ячейки JTable. Алгоритм работы здесь простой. По индексу строки мы из списка beans получаем соответствующую сущность, а по индексу колонки узнаем данные из какого поля MyBean необходимо показать.

public Object getValueAt(int rowIndex, int columnIndex) { MyBean bean = beans.get(rowIndex); switch (columnIndex) { case 0: return bean.getName(); case 1: return bean.getSize(); case 2: return bean.getDescription(); } return "";}

Метод isCellEditable проверяет, редактируема ли ячейка JTable индекс строки и столбца которой передаются мтоду в качестве параметра. (предполагаем, что пользователь может только просматривать данные JTable, но не редактировать их. Тогда метод всегда должен возвращать false.)

public boolean isCellEditable(int rowIndex, int columnIndex) { return false;}

С вышеописанным методом перекликается метод setValueAt. Так как JTable мы сделали нередактируемым, то тело данного метода можно оставить пустым.

import java.awt.Dimension;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set; import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.event.TableModelListener;import javax.swing.table.TableModel; public class TestFrame extends JFrame { static int i = 0; public TestFrame() { super("Тестовое окно"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ArrayList<MyBean> beans = new ArrayList<MyBean>(); for (int i = 0; i < 30; i++) { beans.add(new MyBean("Имя " + i, "Размер " + i, "Описание " + i)); } TableModel model = new MyTableModel(beans); JTable table = new JTable(model); getContentPane().add(new JScrollPane(table)); setPreferredSize(new Dimension(260, 220)); pack(); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame.setDefaultLookAndFeelDecorated(true); new TestFrame(); } }); } public class MyTableModel implements TableModel { private Set<TableModelListener> listeners = new HashSet<TableModelListener>(); private List<MyBean> beans; public MyTableModel(List<MyBean> beans) { this.beans = beans; } public void addTableModelListener(TableModelListener listener) { listeners.add(listener); } public Class<?> getColumnClass(int columnIndex) { return String.class; } public int getColumnCount() { return 3; } public String getColumnName(int columnIndex) { switch (columnIndex) { case 0: return "Имя"; case 1: return "Размер"; case 2: return "Описание"; } return ""; } public int getRowCount() { return beans.size(); } public Object getValueAt(int rowIndex, int columnIndex) { MyBean bean = beans.get(rowIndex); switch (columnIndex) { case 0: return bean.getName(); case 1: return bean.getSize(); case 2: return bean.getDescription(); } return ""; } public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } public void removeTableModelListener(TableModelListener listener) { listeners.remove(listener); } public void setValueAt(Object value, int rowIndex, int columnIndex) { } } public class MyBean { private String name; private String size; private String description; public MyBean(String name, String size, String description) { this.setName(name); this.setSize(size); this.setDescription(description); } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setSize(String size) { this.size = size; } public String getSize() { return size; } public void setDescription(String description) { this.description = description; } public String getDescription() { return description; } }}

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: