410013796724260
• Webmoney
R335386147728
Z369087728698
в помощь разработчикам Swing-приложений
Описание компонента JTreeTableИнтерфейсный компонент JTreeTable позволяет отображать многоуровневую структуру записей в табличном виде. Иерархия данных представлена в первой колонке таблицы. API (Application Programmer Interface) компонента JTreeTable позволяет добавлять, обновлять и удалять записи. Кроме этого, компонент позволяет вызывать callback-функцию при выделении записи в таблице с передачей в функцию выделенного объекта/записи набора данных.
Заметка : На скриншоте представлен проект создания библиотеки gui-widgets (IDE Eclipse) для Swing. Библиотека включает различные интерфейсные компоненты; пакет визуального компонента JTreeTable (org.jabricks.widgets.treetable) отображен в развернутом виде. В таблице приведен список классов пакета org.jabricks.widgets.treetable. Важные выделенные классы, которые следуют использовать при разработке интерфейса приложения и реализации бизнес-логики, описаны ниже.
Интерфейс ITreeTableListenerITreeTableListener включает единственный метод callBack, который должен быть переопределен в родительском классе, реализующим этот интерфейс. Данный метод вызывается каждый раз при выделении какой-либо записи в таблице. Таким образом, родительский класс получает информацию о выделенном объекте, которую может соответствующим образом сразу же обработать. public interface ITreeTableListener { public void callBack (final Object object); } Пример callBack-функцииПри выделении записи в таблице компонент вызывает callBack-функцию объекта, класс которого реулизует интерфейс ITreeTableListener. public void callBack(Object obj) { if (obj != null) { // Определение выделенной записи ObjectNode node = (ObjectNode) obj; System.out.println ("id = " + node.getRecord().getId()); } } Класс ObjectRecordБазовый класс ObjectRecord включает поля id, pid, childRecords (идентификатор записи, идентификатор родительской записи, список дочерних записей) и методы Get/Set (не представлены в листинге) для управления значениями полей. Поля id и pid позволяют сформировать иерархическую структуру записей. Поле childRecords хранит список дочерних записей. ObjectRecord следует использовать в качестве базового класса для формирования иерархического списка данных внешнего хранилища (файл, БД). package org.jabricks.widgets.treetable; import java.util.ArrayList; import java.util.List; public class ObjectRecord { private Integer id ; private Integer pid; private List<ObjectRecord> childRecords; public ObjectRecord() { childRecords = new ArrayList<ObjectRecord>(); } } Класс ObjectNodeБазовый класс ObjectRecord, предназначенный для отображения записи в интерфейсе компонента, включает запись record типа Object, "ссылку" на родительский узел parent типа ObjectNode, список дочерних записей children и методы Get/Set (не представлены в листинге) для управления их значениями. Класс ObjectNode имеет два конструктора : один конструктор получает в качестве параметра только объект записи record, второй — родительский узел parent и объект записи record. Особое значение в данном классе представляют статические закрытые (private) поля fieldName и fieldLeaf, которые определяют наименования полей, используемых для отображения значений и иконок в первой колонке таблицы (дерева). Это, так называемые, значимые поля, которые определяет разработчик при использовании компонента JTreeTable. Статический метод setSignificantFields позволяет определить наименования значимых полей. Методы toString и isLeaf позволяют извлечь значения данных полей из объекта записи. Подробные комментарии к полям и методам приведены в листинге. Исходный код методов toString и isLeaf не представлен (только многоточие). import java.lang.reflect.Field; public class ObjectNode { // Object записи private Object record; // Родительская запись представления в компоненте private ObjectNode parent; // Дочерние записи представления в компоненте private ObjectNode[] children; /* * Наименование поля, которое используется для * отображения в первой колонке таблицы. * Значение fieldName должно быть определено * в наследниках класса. */ private static String fieldName; /* * Наименование поля, используемое для * представления иконки рядом с текстовым * значением в 1-ой колонке компонента. * Значение fieldLeaf должно быть определено в * наследниках класса. */ private static String fieldLeaf; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public ObjectNode(Object record) { this(null, record); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public ObjectNode(ObjectNode parent, Object record) { this.parent = parent; this.record = record; setChildren(new ObjectNode[0]); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Метод получения значения поля leaf - логическое * значение представления иконки записи в компоненте * JTreeTable в виде листа или папки. */ public boolean isLeaf() {...} //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Метод получения значения поля для представления в * 1-ой колонке таблицы (дерева). */ public String toString() {...} //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Метод определения наименований значимых полей * записей fieldLeaf и fieldName для отображения * в 1-ой колонке таблицы/дерева. * @param fldName наименование текстового поля, для * отображения значения в 1-ой колонке таблицы * @param fldLeaf наименование текстового поля, * используемое для отображения иконки * в 1-ой колонке таблицы */ public static void setSignificantFields (String fldName, String fldLeaf) { fieldName = fldName; fieldLeaf = fldLeaf; } } ObjectNode следует использовать в качестве базового класса для отображения иерархического списка данных в визуальном компоненте. Класс ObjectModelКласс ObjectModel включает несколько полей, определяющих заголовки (column_titles) и наименования (column_names) колонок таблицы, а также типы значений по колонкам (column_types). Все эти поля имеют методы Get/Set. Конструкторы класса в качестве параметров получают значения полей. Кроме этого, один из конструкторов получает корневую запись иерархического набора данных root типа ObjectNode. Ниже представлен листинг класса в усеченном виде (не представлены методы Get/Set по полям). Кроме значимых полей визуального компонента и методов Get/Set класс ObjectModel включает дополнительные методы, необходимые для реализации AbstractTreeTableModel. Эти методы представлены после листинга в таблице. public class ObjectModel extends AbstractTreeTableModel { // заголовки колонок private String[] column_titles = null; // наименования колонок private String[] column_names = null; // типы значений по колонкам private Class<?>[] column_types = null; // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public ObjectModel() { super(null); } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public ObjectModel(String[] col_names, String[] col_titles, Class<?>[] col_types) { super(null); this.column_titles = col_titles; this.column_names = col_names; this.column_types = col_types; } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public ObjectModel(ObjectNode root, String[] col_names, String[] col_titles, Class<?>[] col_types) { super(null); this.column_titles = col_titles; this.column_names = col_names; this.column_types = col_types; this.root = root; } // Get/Set . . . // Дополнительные методы . . . }
Заметка : В таблице представлены дополнительные методы класса ObjectModel и описание к ним. Особый комментарий здесь не требуется. Ниже под таблицей представлен пример использования ObjectModel.
Пример использования ObjectModelВ листинге представлен пример использования класса ObjectModel. Полное описание примера JTreeTable приведено здесь. // Объект данных TreeTableData data = new TreeTableData(); // Корневая запись Record record = data.getRootRecord(); // Определение значимых полей ObjectModel.setSignificantFields("name", "leaf"); // Интерфейсный корневой объект иерархической структуры данных ObjectNode rootNode = ObjectModel.convertRecord2Node (record); // Модель представления данных в таблице TreeTable modelData = new ObjectModel(column_names, titles_ru, column_types); modelData.setRootNode(rootNode); // Создание компонента treeTable = new JTreeTable(modelData); treeTable.drawTableHeaderRaised(); treeTable.setName("TreeTableName"); Класс JTreeTableJTreeTable реализует визуальный компонент таблицы с использованием дерева JTree и включением его в первую колонку таблицы JTable. Таким образом, использование дерева в первой колонке таблицы позволяет отображать иерархическую структуру данных. Класс JTreeTable расширяет базовый класс JTable. Конструктор класса принимает в качестве параметра модель данных TreeTableModel. Ниже представлен конструктор класса и цепочка наследований модели данных : // Конструктор класса public JTreeTable(TreeTableModel); // Цепочка наследований interface TreeTableModel extends TreeModel class AbstractTreeTableModel implements TreeTableModel class ObjectModel extends AbstractTreeTableModel Таким образом, конструктор класса в качестве параметра может получать модель описания данных типа ObjectModel, описанную выше. В таблице представлены методы класса JTreeTable с комментариями.
Пример использования JTreeTableИспользование компонента JTreeTable библиотеки gui-widgets для представления многоуровнего иерархического набора записей в таблице в обычном Swing-приложении рассмотрено здесь. В примере демонстрируются методы добавления, обновления и удаления записей, а также вызова callback-функции при выделении записи. Компонент JTreeTable используется в различных интерфейсных OSGi-бандлах; пример Справочник единиц измерения. |