Афоризм
О, как не вовремя порой приходит время.
Наталья Резник
Последние статьи

 • Компонент JDatePicker
Описание и пример компонента JDatePicker
сентябрь 2019
 • Компонент Tree
Описание и пример дерева Tree
сентябрь 2019
 • Grid с навигатором
Описание и пример Gridp с навигатором
сентябрь 2019
 • Компонент Grid
Описание и пример Grid библиотеки base-gui
август 2019
 • Библиотека base-gui
Описание компонентов библиотеки base-gui
август 2019
 • Оператор SELECT
Использование SQL-оператора SELECT
август 2019
 • Сокеты в Android
Использование сокетов в Android
июль 2019
 • Многомодульный maven
Пример создания многомодульного maven проекта
июнь 2019
 • Maven плагин launch4j
Создание exe-файла из исполняемого jar
июнь 2019
в помощь разработчикам Swing-приложений

Пример таблицы Grid

В статье рассмотрен пример создания таблицы и представления в ней набора записей example-grid. В примере продемонстрировано :

  • формат набора записей для загрузки в модель данных таблицы и представление в интерфейсе;
  • добавление новых записей;
  • удаление записей;
  • подключение визуализатора представления целочисленных значений;
  • переименование заголовков таблицы при смене языка локализации.

В качестве компонента таблицы используеся класс org.jabricks.basegui.grid.Grid модуля base-gui. Управление настройками и данными таблицы будет осуществляться с помощью API таблицы (интерфейс org.jabricks.basegui.grid.IGrid).

На следующем скриншоте представлен интерфейс примера после старта. Таблица располагается в центральной части формы. В нижней части формы размещаются кнопки управления.

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

Описание исходного кода примера (класса ExampleGrid) разделим на несколько частей :

  1. Описание данных :
    • 1.1. Набор данных для таблицы.
    • 1.2. Параметры настройки таблицы.
  2. Создание интерфейса :
    • 2.1. Метод создания таблицы.
    • 2.2. Метод создания панели управления.
    • 2.3. Визуализатор представления целочисленных значений.
  3. Управление записями :
    • 3.1. Метод добавления записи.
    • 3.2. Метод удаления записи.
  4. Локализация заголовков колонок таблицы

1.1. Набор данных для таблицы

Наборы данных для таблицы представлены полями drink и drink_add, представляющие собой массивы типа Object[][]. Поле drink включает записи, которые загружаются в таблицу после инсталляции. Поле drink_add содержит 4 записи, которые по одной можно добавить в таблицу нажатием на кнопку "Добавить запись". Значение переменной added_idx определяет индекс добавляемой записи в массиве drink_add.

Одно из значений массива drink во второй колонке имеет отрицательное значение для подсветки визуализатором значения в таблице красным цветом.

private Object[][] drink = 
                   {{ "Пиво бут. 0.5",   5,  50,  250},
                    { "Пиво бан. 0.5",  12,  60,  720},
                    { "Пиво бут. 2.0",   5, 160,  800},
                    { "Байкал 2.0"   ,  10,  75,  750},
                    { "Байкал 1.0"   , -10,  39,  390},
                    { "Coca-cola 1.5",   5,  60,  300},
                    { "Coca-cola 2.0",   5,  78,  390},
                    { "Водка 0.5"    ,   4, 350, 1400},
                    { "Виски 0.5"    ,   1, 980,  980},
                    { "Коньяк 0.5"   ,   1, 890,  890},
                    { "Молоко 0.9"   ,   2,  55,  110},
                    { "Кефир 0.5"    ,   2,  55,  110},
                    { "Ряженка 0.5"  ,   2,  45,   90}};

private Object[][] drink_add = 
                   {{ "Йогурт 0.5" , 4, 55, 220},
                    { "Йогурт 0.25", 6, 35, 210},
                    { "Йогурт 1.0" , 2, 95, 180},
                    { "Кефир 0.5"  , 2, 45,  90}};

private int  added_idx = 0; 

1.2. Параметры настройки таблицы

Параметры настройки таблицы включают объект таблицы grid, массивы типов значений в колонках (classes_drink), выравнивания значений в ячейках таблицы (drink_align) и наименований колонок таблицы (drinkNames). Массив COLUMN_LOCALES содержит локализованные заголовки колонок таблицы для двух языков (ru, en). Переменная locale определяет текущий язык локализации.

private IGrid  grid;

// типы значений в колонках таблицы
private Class<?>[] classes_drink = {
                            String.class, Integer.class,
                            Integer.class,Integer.class};
// наименование колонок таблицы
private String [] drinkNames  = {"name", "quantity", 
                                 "price", "cost"};

// выравнивание значений в ячейках таблицы
private Integer[] drink_align = {JLabel.LEFT, JLabel.RIGHT,
                                 JLabel.RIGHT,JLabel.RIGHT};

// Объект текущей локализации колонок таблицы
Locale  locale = new Locale("ru");

// Локализованные заголовки колонок
private String [][] COLUMN_LOCALES = {
                       {"Наименование", "Количество" ,
                        "Цена"        , "Стоимость" },
                       {"Name"        , "Quantity"   ,
                        "Price"       , "Cost"}};

2.1. Метод создания таблицы

При создании объекта Grid используются описания (массивы) типов колонок, наименований колонок и заголовки колонок, получаемые вызовом метода getColumnNames. Метод getColumnNames формирует массив заголовков согласно текущему значению языка локализации. Конечно же, излишество в виде локализации заголовков используется очень редко. Но, если компонент это позволяет, то можно его использовать для динамической локализации интерфейса в целях демонстрации.

Объект таблицы Grid представляет собой компонент панели типа JPanel, реализующий интерфейс IGrid. Всё пространство панели занимает компонент JTable, «обернутый» в скроллинг JScrollPane.

После создания таблицы выполняется её настройка : определение выравнивания значений в ячейках таблицы и определение размеров колонок. Возможность перемещения колонок таблицы блокируется. Помните, что при разрешении перемещения колонок необходимо контролировать типы значений добавляемых и редактиремых записей.

При подключении визуализатора целочисленных значений используется функция setDefaultRenderer.

private void createGid()
{
    // Создание таблицы
    grid = new Grid(classes_drink,
                    drinkNames, 
                    getColumnNames());
    // Настройка таблицы
    grid.setColumnsAlign(drink_align);
    grid.setReorderingAllowed(false);
    grid.setColumnsWidth(new int[] {220, 90, 90, 80});

    // Подключение визуализатора
    grid.setDefaultRenderer(Integer.class, 
                                    new IntegerRenderer());
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
private String[] getColumnNames()
{
    String[] names = new String[drinkNames.length];
    int idx = 1;
    if (locale.getLanguage().equalsIgnoreCase("ru"))
        idx = 0;

    for (int i = 0; i < drinkNames.length; i++)
        names[i] = COLUMN_LOCALES[idx][i];
    return names;
}

2.2. Метод создания панели управления

Метод createControls() формирует панель управления типа JPanel и размещает в ней 3 кнопки управления. К кнопкам подключаются соответствующие обработчики событий. При нажатии кнопки локализации btnLocale изменяется объект локализации locale, формируются свойства props и вызывается метод setLocale cо свойствами. При нажатии на кнопки управления записями (добавление, удаление) вызываются соответствующие методы.

Метод createControls возвращает панель с кнопками управления для её размещения в интерфейсе окна.

private JPanel createControls()
{
    JButton btnLocale;
    btnLocale = new JButton("Изменение языка локализации");
    btnLocale.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (locale.getLanguage().equalsIgnoreCase("ru"))
                locale = new Locale("en");
            else
                locale = new Locale("ru");
            Properties props = getColumnProps();
            grid.setLocale(props);
        }
    });
    JButton btnAdd = new JButton("Добавить запись");
    btnAdd.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            addRecord();
        }
    });

    JButton btnDel = new JButton("Удалить запись");
    btnDel.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            deleteRecord();
        }
    });
    // Панель кнопок управления
    JPanel pnlButtons = new JPanel();
    pnlButtons.add(btnLocale );
    pnlButtons.add(btnAdd    );
    pnlButtons.add(btnDel    );
    
    return pnlButtons;
}

2.3. Визуализатор представления целочисленных значений

Визуализатор IntegerRenderer используется для подсвечивания отрицательных значений красным цветом. IntegerRenderer расширяет свойства метки типа JLabel и реализует метод getTableCellRendererComponent интерфейса TableCellRenderer.

При создании таблицы по умолчанию используются визуализаторы различных типов значений. В примере IntegerRenderer демонстрирует возможность использования собственного визуализатора.

public class IntegerRenderer extends JLabel 
                             implements TableCellRenderer
{
    private static final long serialVersionUID = 1L;
    Color   COLOR_selection = UIManager.getColor(
                                "Table.selectionBackground");
    Border  BORDER_selected = new LineBorder(
                                   new Color(142, 169, 204));

    @Override
    public Component getTableCellRendererComponent(
                                        JTable table,
                                        Object value,
                                        boolean isSelected,
                                        boolean hasFocus, 
                                        int row,
                                        int column) {
        setFont(table.getFont());

        setOpaque(true);
        setBackground(Color.white);
        if(isSelected)
            setBackground(COLOR_selection);
        if (hasFocus)
            setBorder(BORDER_selected);
        else
            setBorder(new LineBorder(null, 0));

        if (value != null) {
            if ((Integer)value < 0) {
                setForeground(Color.red);
        } else
            setForeground(Color.black);
        }
         setHorizontalAlignment(JLabel.RIGHT);
        if (value == null)
            setText("");
        else
            setText(String.valueOf(value) + " ");
        return this;
    }
}

Подключение визуализатора

Для подключения визуализатора вызывается метод setDefaultRenderer класса Grid, которому в качестве параметров передаются тип класса и объект визуализатора.

grid.setDefaultRenderer(Integer.class,new IntegerRenderer());

3.1. Добавление записи

Метод addRecord вызывается при нажатии на кнопку «Добавить запись». В методе выполняется проверка наличия недобавленных записей (переменная added_idx); при положительном условии запись добавляется методом addRecord в конец таблицы. При необходимости можно использовать метод «addRecord (final int row, final Object[] record)» для добавления записи в конкретную позицию набора данных таблицы.

private void addRecord()
{
    if (added_idx <= (drink_add.length - 1))
        grid.addRecord(drink_add[added_idx++]);
}

Метод «addRecords (final Object[][] data)» позволяет загрузить в таблицу несколько записей. Если модель данных не пустая, т.е. таблица уже содержит записи, то они будут предварительно удалены, после чего в таблицу будет загружен новый массив записей.

3.2. Удаление записи

Метод deleteRecord вызывается при нажатии на кнопку Удалить запись». Удалить можно только выделенную запись.

private void deleteRecord()
{
    // Удаляемая строка
    int row = grid.getTable().getSelectedRow();
    if (row >= 0)
        grid.delRecord(row);
}

Метод «delRecords (final int[] rows)» позволяет удалить из таблицы несколько записей. В качестве параметра метод получает массив удаляемых строк.

4. Локализация заголовков колонок таблицы

Для локализации заголовков таблицы необходимо подготовить объект свойств типа Properties, включающий набор записей типа 'ключ=значение'. В нашем случае ключом является наименование колонки. Обычно файлы свойств для нескольких языков локализации включены в jar-файл. Но в примере свойства формирует метод getColumnProps, выбирающий необходимый массив заголовков согласно текущему языку локализации.

private Properties getColumnProps()
{
    Properties props = new Properties();
    int idx = 1;
    if (locale.getLanguage().equalsIgnoreCase("ru"))
        idx = 0;

    for (int i = 0; i < drinkNames.length; i++)
        props.setProperty(drinkNames[i], 
                            COLUMN_LOCALES[idx][i]);
    return props;
}

Для локализации заголовков колонок таблицы Grid необходимо вызвать метод setLocale с параметром Properties :

grid.setLocale(props);

Главный класс примера ExampleGrid

Ниже представлен листинг примера ExampleGrid в усеченном виде. Все переменные и методы, описанные выше, не включены в код.

public class ExampleGrid extends JFrame
{
    private static final long serialVersionUID = 1L;

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    public ExampleGrid()
    {
        super("Grid example");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        createGid();

        getContentPane().add(grid.asWidget (), 
                                    BorderLayout.CENTER);
        getContentPane().add(createControls(), 
                                    BorderLayout.SOUTH);
        setSize(520, 360);

        // Загрузка данных
        grid.addRecords(drink);

        setVisible(true);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    public static void main(String[] args) {
        new ExampleGrid();
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

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

Архив примера включает командный файл run-example-grid.bat для старта example-grid.jar в Windows. Пользователи Linux должны создать свой командный файл старта примера. Обратите внимание, что команда запуска примера включает classpath с двумя jar-файлами; модуль base-gui-1.0.0.jar располагается в поддиректории lib.

java -cp example-grid.jar;lib/base-gui-1.0.0.jar \
      org.jabricks.basegui.examples.ExampleGrid

Для старта примера не из командной строки требуется предусмотреть чтение JVM библиотеки base-gui-1.0.0.jar. Для этого можно включить модуль lib/base-gui-1.0.0.jar в classpath манифеста META-INF/MANIFEST.MF, как это реализовано в примере example-gridp, либо использовать динамическую загрузку архивных jar-библиотек, описанную в примере example-grid-check.

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

Архивный файл base-gui-example.zip включает данный пример (example-grid) и другие примеры использования модуля base-gui.jar.

  Рейтинг@Mail.ru