Афоризм
Ты правда глупый или это имидж?
Наталья Резник
Последние статьи

 • Активности Android
Многоэкранные Android приложения
 • Fragment dynamic
Динамическая загрузка фрагментов в Android
 • Fragment lifecycle
Жизненный цикл Fragment'ов в Android
 • Fragment example
Пример Fragment'ов в Android
 • Data Binding
Описание и пример Data Binding
 • Пример MVVM
Пример использования MVVM в Android
 • Компонент TreeTable
Описание компонента TreeTable для Swing
 • Пример TreeTable
Пример использования TreeTable
 • Хранилища Android
Внутренние и внешние хранилища данных
 • Пример SQLite
Пример использования SQLite в Android
 • WebSocket
Описание и пример реализации WebSocket
 • Визуальные компоненты
Улучшен компонент выбора даты из календаря
 • Анимация jQuery
Описание и примеры анимации элементов DOM
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
 • Yandex.Деньги
  410013796724260

 • Webmoney
  R335386147728
  Z369087728698
в помощь разработчикам Swing-приложений

Пример компонента JTreeTable

В статье рассмотрен пример создания таблицы с использованием интерфейсного компонента JTreeTable библиотеки gui-widgets для представления многоуровнего иерархического набора записей. В примере example-treetable демонстрируются возможности API JTreeTable, связанные с добавлением, обновлением и удалением записей, а также с вызовом callback функции при выделении одной из записей таблицы.

На следующем скриншоте представлен интерфейс примера example-treetable после старта.

Кнопки управления в нижней части формы позволяют добавлять, обновлять и удалять записи. При нажатии на кнопку Добавить создается новая запись и вставляется в таблицу. В качестве родительского узла будет выбрана выделенная запись, если это узловая запись, либо родительская запись выделенной не узловой записи. При нажатии на кнопку Сохранить обновляются значения полей Количество и Стоимость выделенной записи; значения генерируются случайным образом. При нажатии на кнопку Удалить выделенная запись удаляется.

При выделении записи в таблице открывается окно с отображением идентификатора и наименования записи. Кроме этого, наименования колонок локализуются с русского языка в английский и наоборот.

Описание примера

Проект example-treetable в IDE Eclipse, представленный на следующем скриншоте, включает :

  1. Класс описания записи Record;
  2. Класс с данными TreeTableData;
  3. Главный класс ExampleTreeTable.

Примечание : листинги классов и их методов представлены в свернутом виде. В конце страницы можно скачать рассматриваемый пример.

Класс Record

Класс Record расширяет свойства базового класса ObjectRecord и используется для загрузки данных в таблицу.

Базовый класс ObjectRecord (POJO) из библиотеки интерфейсных компонентов gui-widgets включает идентификатор записи id, идентификатор родительской записи pid, список дочерних записей childRecords и методы Get/Set для управления этими полями. Поля id и pid позволяют сформировать иерархическую структуру записей. Ниже в листинге представлен ObjectRecord, методы Get/Set не представлены :

Поля класса ObjectRecord

package org.jabricks.widgets.treetable;

public class ObjectRecord
{
    private  Integer  id ;
    private  Integer  pid;
    // список дочерних записей
    private  List<ObjectRecord> childRecords;

    public ObjectRecord() 
    {
        childRecords = new ArrayList<ObjectRecord>();
    }
    . . .
}

Класс Record включает дополнительные 3 поля (name, qty, cost) для отображения в таблице/форме следующих значений : наименование товара, количество товара и стоимость. Логическое значение поля leaf определяет отношение записи к простому узлу (лист) или к папке с дочерними записями. Поле leaf используется для отображения в первой колонке таблицы иконки, которая символизирует тип узла (лист/папка). Необходимо отметить, что папка с дочерними записями может быть пустой.

Листинг Record

package org.jabricks.widgets.treetable;

import org.jabricks.widgets.treetable.ObjectRecord;

public class Record extends ObjectRecord
{
    private  String   name;
    private  Integer  qty ;	
    private  Float    cost;
    public   boolean  leaf;

    public Record() 
    {
        super();
        leaf = true;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getQty() {
        return qty;
    }
    public void setQty(Integer qty) {
        this.qty = qty;
    }
    public Float getCost() {
        return cost;
    }
    public void setCost(Float cost) {
        this.cost = cost;
    }
    public boolean isLeaf() {
        return leaf;
    }
    public void setLeaf(boolean leaf) {
        this.leaf = leaf;
    }
}

Класс с описание данных TreeTableData

Структурно класс TreeTableData, используемый как внешнее хранилище данных, включает поля/переменные, конструктор и методы. Ниже представлен листинг класса, в котором отдельные методы отображены в усеченном виде. В полном виде с комментариями эти методы рассмотрены ниже.

Поля массива исходных данных basket для отображения в табличном компоненте имеют следующие назначения (отсчет от 0) :

  • 0 – id, идентификатор записи;
  • 1 – pid, идентификатор родительской записи;
  • 2 – name, наименование записи;
  • 3 – qty, количество;
  • 4 – cost, стоимость.

Нулевые (null) значения массива касаются полей qty и cost узловых записей (папки).

Конструктор класса вызывает метод createObjectRoot для формирования из массива записей списка records объектов типа Record. Первый элемент массива records становится корневым элементом иерархической структуры записей, которую формирует createRootRecord(records) с использованием рекурсивного метода createTreeRecord(Record, List<Record>).

Листинг структуры TreeTableData

package org.jabricks.widgets.treetable;

import java.util.ArrayList;
import java.util.List;

public class TreeTableData
{
    // Массив данных для отображения в таблицы
    private Object[][] basket = {
                    { 0, 0, "Список товаров", null, null}, 
                    { 1, 0, "Продукты"      , null, null},
                    { 3, 1, "Молочные"      , null, null}, 
                    { 4, 1, "Хлеб"          , null, null}, 
                    { 5, 0, "Промтовары"    , null, null}, 
                    { 6, 4, "Хлеб дарницкий",    1,  40f},
                    { 7, 4, "Батон нарезной",    1,  48f},
                    { 8, 3, "Сметана"       ,    1,  64f},
                    { 9, 3, "Молоко"        ,    3, 198f},
                    {10, 5, "Лампочки"      ,    2, 180f},
                    {11, 5, "Батарейки"     ,    4,  80f},
                    {12, 5, "Замок"         ,    1,1200f},
                    {13, 5, "Кран Kaiser"   ,    1,2400f}};

    // Корневой элемент иерархической структуры 
    private Record root = null;

    // Массив объектов типа Record, формируемый из basket
    static List<Record> records = null;
    //-----------------------------------------------------
    public TreeTableData()
    {
        createObjectRoot();
    }
    //-----------------------------------------------------
    public Record getRootData()
    {
        return root;
    }
    //-----------------------------------------------------
    /**
     * Метод преобразования массива basket в список
     * records и вызов метода формирования иерархической
     * структуры данных.
     */
    private void createObjectRoot()
    {
        records = new ArrayList<Record>();
        . . .
        createRootRecord(records);
    }
    //-----------------------------------------------------
    /**
     * Метод определения корневой записи root.
     * @param records список записей
     */
    private void createRootRecord(List<Record> records)
    {
        root = records.get(0);
        root.setLeaf(false);

        createTreeRecord(root, records);
    }
    //-----------------------------------------------------
    /**
     * Рекурсивная процедура построения дерева записей
     * @param records список записей
     * @param record текущий узел
     */
    private void createTreeRecord(Record record, 
                                  List<Record> records)
    {
        for (int i = 1; i < records.size(); i++) {
           . . .
        }
    }
    //-----------------------------------------------------
    /**
     * Метод определения идентификатора новой записи
     * @return id новой записи
     */
    public static int getMaxID()
    {
        int id = 0;
        . . .
        return id + 1;
    }
    //-----------------------------------------------------
    /**
     * Метод формирования новой записи
     * @return новая запись типа Record
     */
    public static Record createNewRecord()
    {
        Record record = new Record();
        . . .
        return record;
    }
    //-----------------------------------------------------
}

Ниже представлены развернутые методы

  • createObjectRoot — преобразования массива данных basket типа Object[][] в список records,
  • createTreeRecord — рекурсивный метод преобразования списка записей records в иерархическую структуру с корневым элементом root,
  • createNewRecord — метод создания новой записи,
  • getMaxID — метод определения идентификатора новой записи.

В тексте методов небольшие комментарии.

Листинг методов TreeTableData

/**
 * Метод преобразования массива basket в список records и
 * вызов метода формирования иерархической структуры данных.
 */
private void createObjectRoot()
{
    // список записей
    records = new ArrayList<Record>();
    // цикл перебора массива
    for (int i = 0; i < basket.length; i++) {
        // создание записи и определение её значений
        Record or = new Record();
        or.setId  (Integer.valueOf(basket[i][0]));
        or.setPid (Integer.valueOf(basket[i][1]));
        or.setName((String)        basket[i][2]);
        if (basket[i][3] != null)
            or.setQty  (Integer.valueOf(basket[i][3]));
        if (basket[i][4] != null)
            or.setCost(Float.valueOf((Float)basket[i][4]));
        // определения флага листа или узловой записи
        or.setLeaf((basket[i][3] != null) && 
                   (basket[i][4] != null));
        records.add(or);
    }
    root = createRootRecord(records);
}
//---------------------------------------------------------
/**
 * Рекурсивная процедура построения дерева записей
 * @param record текущая запись
 * @param records список записей
 */
private void createTreeRecord(Record record, 
                              List<Record> records)
{
   // цикл перебора
   for (int i = 1; i < records.size(); i++) {
     // проверка соответствия идентификатора родительскому
     if (records.get(i).getPid() == record.getId()) {
        // создание дочерней записи
        Record child = records.get(i);
        record.getChildren().add(child);
        for (int j = 1; j < records.size(); j++) {
           if (records.get(j).getPid() == child.getId()) {
               child.getChildren().add(records.get(j));
               if (!records.get(j).isLeaf())
                 createTreeRecord(records.get(j),records);
           }
        }
      }
   }
}
//---------------------------------------------------------
/**
 * Метод определения идентификатора новой записи
 * @return id новой записи
 */
public static int getMaxID()
{
    int id = 0;  // идентификатор максимальной записи
    // перебор всех записей
    for (int i = 0; i < records.size(); i++) {
        if (records.get(i).getId() > id)
            id = records.get(i).getId().intValue();
    }
    return id + 1;
}
//---------------------------------------------------------
/**
 * Метод создания новой записи типа Record
 */
public static Record createNewRecord()
{
    Record record = new Record();
    record.setId(getMaxID());
    record.setQty ((int)(Math.random() * 10));
    float f;
    f = ((float) record.getQty() * Math.random() * 100);
    f = ((int)f * 10) / 10;
    record.setCost(f);
    record.setName("Добавленная запись-" + record.getId());
    records.add(record);
    return record;
}
 

Класс ExampleTreeTable

В листинге класса ExampleTreeTable представим только структуру и поля; используемые методы рассмотрим ниже, чтобы не сваливать всё в кучу, а сделать код более прозрачным. Подробные комментарии в коде сделают описание класса более наглядным. На что следует обратить внимание :

  • ITreeTableListener – реализуемый классом интерфейс, согласно которому в классе определяется метод callBack(Object), вызываемый при выделении записи в таблице. Метод callback в качестве параметра получает выделенную в таблице запись типа Object;
  • column_names – наименования колонок. Каждая колонка имеет свое наименование, согласно которому компонент JTreeTable будет отображать значение соответствующего поля объекта/записи;
  • column_types – типы значений колонок/полей. Компонент отображает значения полей записей согласно типу колонки. Первая колонка имеет тип TreeTableModel.

Листинг структуры ExampleTreeTable


package org.jabricks.widgets.treetable;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.tree.TreePath;

import org.jabricks.widgets.treetable.JTreeTable;
import org.jabricks.widgets.treetable.ObjectModel;
import org.jabricks.widgets.treetable.ObjectNode;
import org.jabricks.widgets.renderers.FloatRenderer;
import org.jabricks.widgets.treetable.TreeTableModel;
import org.jabricks.widgets.treetable.ITreeTableListener;

public class ExampleTreeTable implements ITreeTableListener
{
    private JFrame      frame    ;
    private ObjectModel modelData;  // Модель данных
    private JTreeTable  treeTable;  // Компонент JTreeTable

    // флаг определения языка : true русс., false англ. 
    private boolean lang_ru = true;      

    // заголовки таблицы, английский язык
    private String[] titles_en = {"Name", "Quantity",
                                          "Cost"};
    // заголовки таблицы, русский язык 
    private String[] titles_ru = {"Наименование",
                                  "Количество",
                                  "Стоимость"};
    // наименование колонок таблицы
    private String[] column_names = {"name", "qty", "cost"};

    // типы значений по колонкам таблицы
    private Class<?>[] column_types = {
                                      TreeTableModel.class, 
                                      Integer.class, 
                                      Float.class};
    //размеры колонок таблицы
    private int cols_width[]  = {350, 110, 120};
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Конструктор класса
     */
    public ExampleTreeTable() {
        . . .
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Метод вывода сообщения о выделенной записи
     */
    private void onClickNode(Record record) {
        . . .
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Функция обратного вызова.
     * Компонент JTreeTable вызывает данную функцию и передает
     * ей в качестве параметра выделенную запись типа Object
     */ 
    @Override
    public void callBack(Object obj) {
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Создание панели кнопок управления.
     * В методе определяются кнопки управления, к слушателям
     * которых подключаются методы выполнения транзакций :
     * recordAdd(), recordUpdate(), recordDel()
     */
    private void createButtonsPanel(JPanel pnlButtons){
       . . .
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Метод определения выделенной записи.
     * Используется при выполнении транзакций
     */
    private Object getTreeTableSelectedObject() {
       . . .
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    private void recordAdd() {
       . . .
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    private void recordUpdate(){
       . . .
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    private void recordDel(){
       . . .
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    public static void main(String[] args)
    {
	    new ExampleTreeTable();
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Описание методов класса ExampleTreeTable

Выше представлена структура класса ExampleTreeTable с определением наименований методов, листинги которых раскрыты ниже. В коде методов подробные комментарии. В листингах методов используются классы Record и ObjectNode. В чём различие объектов типа Record и ObjectNode?

Объекты Record и ObjectNode

Объект типа Record — это запись, которая может храниться в базе данных или во внешнем файле. То есть, объект Record предназначен для длительного хранения данных. Объект типа ObjectNode — это интерфейсный объект для отображения значений в таблице. Жизненный цикл данного объекта связан только с временем функционирования программы; остановили программу, объект ObjectNode прекратит свое существование. В структуру класса ObjectNode входит либо один (для листа), либо список (для папки) классов/объектов Record.

Метод callBack

Данный метод вызывается компонентом JTreeTable при выделении записи в таблице. В качестве параметра метод получает интерфейсный объект типа ObjectNode.

Листинг метода callBack

/**
 * Функция обратного вызова.
 * Компонент JTreeTable вызывает данную функцию и передает
 * ей в качестве параметра выделенную запись типа Object
 */ 
@Override
public void callBack(Object obj)
{
    try {
        if (obj != null) {
            // Определение выделенной записи
            ObjectNode node = (ObjectNode) obj;

            // Определение флага языка локализации
            lang_ru = !lang_ru;
            // Определение заголовков колонок таблицы
            if (lang_ru)
                treeTable.setColumnTitles(titles_ru);
            else
                treeTable.setColumnTitles(titles_en);
            // Получение объекта записи выделенного узла
            onClickNode((Record) node.getRecord());
        }
    } catch (Exception e) {}
}

Метод onClickNode

Метод отображения параметров выделенной записи. Сначала формируется текст, после этого вызывается метод showMessageDialog диалогового окна JOptionPane.

Листинг метода onClickNode


/**
 * Метод вывода сообщения о выделенной записи
 */
private void onClickNode(Record record)
{
    if (record != null) {
        String text = "id=" + record.getId() + 
                      ", name=" + record.getName();
        JOptionPane.showMessageDialog(null,
                          "Вы выбрали запись : \n" + text, 
                          "Выделенная запись", 
                          JOptionPane.INFORMATION_MESSAGE);
    }
}

Метод getTreeTableSelectedObject

Функция getTreeTableSelectedObject используется для определения выделенного интерфейсного объекта/записи. Как мы видим объект treeTable имеет метод getTree(), возвращающий реализацию объекта JTree. Методом getSelectionPath() класса JTree получаем полный путь TreePath (path) к выделенной записи, начиная с корневого узла. Метод getLastPathComponent() позволяет получить выделенной объект в полном пути.

Листинг метода getTreeTableSelectedObject

/**
 * Метод определения выделенной записи.
 * Используется при выполнении транзакций
 */
private Object getTreeTableSelectedObject()
{
    Object object = null;
    TreePath path = treeTable.getTree().getSelectionPath();
    if (path != null)
        object = (ObjectNode) path.getLastPathComponent();
    return object;
}

Конструктор класса ExampleTreeTable

Конструктор класса создает интерфейсные компоненты, загружает данные и формирует интерфейс. На что следует обратить внимание в конструкторе :

  • методом data.getRootNode конструктор получает иерархическую структуру записей, полученную (условно) из хранилища (внешний файл, база данных);
  • интерфейсный корневой элемент rootNode типа ObjectNode создается конвертацией списка записей методом ObjectModel.convertRecord2Node библиотеки gui_widgets;
  • модель представления записей modelData в таблице формируется из массивов наименований, заголовков и типов значений колонок (new ObjectModel(column_names, titles_ru, column_types));
  • конструктор класса JTreeTable получает модель представления данных modelData;
  • класс должен наследовать интерфейс ITreeTableListener, чтобы компонент могут вызвать callback-функция и передать информацию о выделении записи;
  • компонент JTreeTable имеет методы определения размера колонок и высоты строки;
  • API JTreeTable имеет методы для выделения определенной записи в иерархической структуре данных.

Листинг конструктора

/**
 * Конструктор класса
 */
public ExampleTreeTable()
{
    try {
      UIManager.setLookAndFeel(UIManager.getLookAndFeel());
    } catch (UnsupportedLookAndFeelException e1) {}  

    JFrame.setDefaultLookAndFeelDecorated(true);

    frame = new JFrame("Пример использования TreeTable");
    frame.setSize(new Dimension(600, 400));

    frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent we) {
            System.exit(0);
        }
    });

    // Объект данных
    TreeTableData data = new TreeTableData();
    
    // Корневая запись
    Record record = data.getRootNode();

    // Определение значимых полей
    ObjectModel.setSignificantFields("name", "leaf");
    /*
     * Интерфейсный корневой объект иерархической 
     * структуры данных rootNode
     */
    ObjectNode rootNode; 
    rootNode = ObjectModel.convertRecord2Node (record);

    // Модель представления данных в таблице TreeTable  
    modelData = new ObjectModel(column_names, 
                                titles_ru,
                                column_types);
    treeTable = new JTreeTable(modelData);
    treeTable.drawTableHeaderRaised();
    treeTable.setName("TreeTableName");

    // Подключение метода callback
    treeTable.setParentCallBack(this);

    // Настройка компонента
    treeTable.setColumnsWidth(cols_width);
    treeTable.setRowHeight(22);
    // Подключение FloatRenderer библиотеки gui_widgets
    treeTable.setDefaultRenderer(Float.class, 
                                 new FloatRenderer());
//  int autoresize = JTable.AUTO_RESIZE_OFF |
//                   JTable.AUTO_RESIZE_ALL_COLUMNS;
//  treeTable.setAutoResizeColumn (autoresize); 

    // Панель кнопок управления
    JPanel pnlButtons = new JPanel();
    pnlButtons.setPreferredSize(new Dimension(400, 40));
    pnlButtons.setSize         (new Dimension(400, 40));
    pnlButtons.setBackground(Color.LIGHT_GRAY);

    createButtonsPanel(pnlButtons);
    frame.getContentPane().add(pnlButtons, 
                               BorderLayout.SOUTH);
    frame.getContentPane().add(new JScrollPane(treeTable), 
                                    BorderLayout.CENTER);

    // Загрузить в компонент данных
    modelData.setRootNode(rootNode);
    treeTable.updateUI();

    //~~~ Выделение записи в таблице ~~~
    // путь выделяемой записи в дереве
    final int[] rows = {0,1,2,4}; //  
    // последний узел в таблице выделить
    treeTable.selectRow(rows, true);
    // treeTable.selectRow(0, true);  
    frame.setVisible(true);
}

Листинг метода recordAdd

Метод добавления новой записи. Подробный комментарий представлен в коде.

Листинг recordAdd

/**
 * Метод добавления новой записи в таблицу : 
 *  - создание новой записи типа Record,
 *  - создание интерфейсного объекта типа ObjectNode
 *  - включение Record и в объект ObjectNode
 *  - добавление интерфейсного объекта в таблицу
 *
 */
private void recordAdd()
{
     // Путь выделенного объекта
    TreePath path = null;

    // Родительский объект в таблице
    ObjectNode parent = null;

    Определение родительского объекта
    path   = treeTable.getTree().getSelectionPath();
    parent = (ObjectNode)getTreeTableSelectedObject();

    // Выделенная запись папка (узловая запись) или лист?
    if ((parent != null) && parent.isLeaf()) {
        // Переопределение родительской записи
        parent = parent.getParent();
        path   = path.getParentPath();
        treeTable.getTree().getSelectionModel()
                           .setSelectionPath(path);
    }
    // Родительская запись
    Record record = null;
    if (parent != null)
        record = (Record)parent.getRecord();
    if (record != null) {
        // Новая запись
        Record  item = TreeTableData.createNewRecord();
        // Новый интерфейсный объект
        ObjectNode object = new ObjectNode(item);
        // Определение родителя 
        object.setParent((ObjectNode)parent);
        /*
         * Добавление новой записи в таблицу. Последний 
         * логический параметр метода addNode определяет
         * необходимость выделения новой добавленной записи
         */
        treeTable.addNode(parent, object, path, 
                                  modelData, true);
    }
}

Метод recordUpdate

Обновление выделенной записи выполняется в несколько шагов. Сначала определяется выделенный объект ObjectNode в таблице и запись этого объекта Record. После этого обновляются его значения случайным образом. В заключении объект обновляется в интерфейсе/таблице.

Листинг recordUpdate

/**
 * Метод обновления записи. В методе случайным образом 
 * определяются значения полей qty, cost выделенной записи.
 */
private void recordUpdate()
{
    // Выделенный объект таблицы
    ObjectNode object = null;
    // Запись выделенного объекта
    Record record = null;

    object = (ObjectNode)getTreeTableSelectedObject();
    if (object != null)
        record = (Record)object.getRecord();
    if (record != null) {
        // Обновление значений выделенной записи
        record.setQty((int)(Math.random() * 100));
        record.setCost((float) (record.getQty() * Math.random() * 100));

        // Путь выделенной записи
        TreePath path = treeTable.getTree().getSelectionPath();
        // Обновление выделенной записи в таблице
        treeTable.updateNode(object, path, modelData, true);
    }
}

Метод recordDel

В методе не проверяется наличие выделенной записи, т.е. равенство object=null, чтобы показать окно с предупреждением. Поэтому удаляется как отдельная запись (лист), так узловая запись (папка).

Листинг recordDel

/**
 * Метод удаления записи
 */
private void recordDel()
{
    ObjectNode object; // выделенная в таблице запись
    object = (ObjectNode)getTreeTableSelectedObject();
    // Удаление записи
    treeTable.deleteNode(object, 
                         treeTable.getTree().getSelectionPath(), 
                         modelData);
}

Старт примера

Для старта примера в Windows можно использовать командный файл run-example-treetable.bat. Исполняемый example-treetable.jar (runable) может быть также стартован обычным способом (двойным нажатием клавишей мыши), поскольку модуль lib/gui-widgets-1.0.5.jar включен в classpath манифеста META-INF/MANIFEST.MF.

Скачать пример

Архивный файл example-treetable.zip (197 КБ) включает проект example-treetable в среде IDE Eclipse, библиотеку gui-widgets и командный файл run-example-treetable.bat для старта примера.

  Рейтинг@Mail.ru