Укрощение jTable. Часть 1. Вводная. Дело в шапке
Угораздило меня ввязаться в этот проект! Собственно задача не большая, а о бюджете вообще только поплакать хочется… А все этот экспириенс… Жадный я до него. Очень уж хотелось взяться за десктоп-приложение на java. Вроде бы как и не модно сейчас, и прошла уже эра настольных программ, и опыт разработки в этой области не маленький, и с джавою приходилось работать, но все больше по части веб сервисов. Вот и не утерпел…
В качестве рабочего инструмента мы остановились на NetBeans. Ну а в качестве библиотеки для разработки GUI — Swing. О нем и речь, а именно о контроле JTable. Немного разобравшись в инструментарии я аккуратненько уложил табличку на панель и взялся за дело.
Как и следовало ожидать, с визуальным редактором свойств не очень-то развернешься. Ну ручками, так ручками. Так даже интереснее. Итак, что нам нужно:
1) настроить колонки таблицы — заголовки, ширину;
2) заполнить таблицу данными;
3) нам нужна сортировка;
4) а потом хочется пораскрасить строчки (заказчик очень просил).

Рисунок 1. С чего все начиналось
Ну что ж начнем с шапки таблицы и настройки колонок.
Естественно я тут не привожу реальных данных проекта. Таблицу периодических элементов Менделеева пока рисовать тоже не будем. А сделаем для примера табличку со списком дней рождений.
Все управление общим отображением и заполнением JTable данными выполняется с помощью класса TableModel. Т.е. задача оформления таблицы сводится к описанию TableModel. Предположим, что данные предварительно загружены в ArrayList, где каждый элемент — экземпляр вот такого замечательного класса Buddy.
public class Buddy { public int num; public String name; public Date birthDate; public String phone; public String email; }
// Определяем список колонок final String[] colNames = {"Номер", "Фамилия, имя, отчество", "Дата рожд.", "Телефон", "Email"}; // Описываем модель таблицы TableModel myDataModel = new AbstractTableModel() { // тут все просто - это количество столбцов @Override public int getColumnCount() { return colNames.length; } // это количество строк (длина нашего ArrayList с данными) @Override public int getRowCount() { return alBuddies.size();} // здесь уже интереснее - метод возвращает данные для ячейки таблицы @Override public Object getValueAt(int row, int col) { Buddy buddy = (Buddy) alBuddies.get(row); switch (col) { case 0: return buddy.num; case 1: return buddy.name; case 2: return dateFormat.format(buddy.birthDate); // тут пришлось немного отформатировать дату case 3: return buddy.phone; case 4: return buddy.email; default: return ""; } } // этот метод возвращает имена столбцов @Override public String getColumnName(int column) {return colNames[column];} // пока запрещаем редактирование данных в таблице, этим займемся позже @Override public boolean isCellEditable(int row, int col) {return false;} // оставляем как есть, потом вернемся @Override public void setValueAt(Object aValue, int row, int column) {} @Override public Class getColumnClass(int c) {return (String.class);} }; // Говорим таблице какую модель использовать tableBuddies.setModel(myDataModel);

Уже получше, но до идеала еще далеко
Немного подкрутим ширину столбцов.
tableBuddies.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); tableBuddies.getColumnModel().getColumn(0).setPreferredWidth(80); tableBuddies.getColumnModel().getColumn(1).setPreferredWidth(300);
И подведем итог. Колонки настроены, заголовки столбцов прописаны, ширина столбцов настроена, данные в таблице отображаются.
Теперь можно заняться сортировкой. Т.е. продолжение следует…

Добавить комментарий