Афоризм
Чтобы оставаться худой, женщине надо есть перед зеркалом и обнаженной.
Последние статьи

 • RawContacts
Необработанные контакты в Android
 • javax.crypto.Cypher
Cимметричное шифрование и дешифрирование
 • Random, Math.random
Генерация случайных чисел
 • Компонент JDatePicker
Описание и пример компонента JDatePicker
 • Компонент Tree
Описание и пример дерева Tree библиотеки base-gui
 • Grid с навигатором
Описание и пример Gridp с навигатором
 • Компонент Grid
Описание и пример Grid библиотеки base-gui
 • Библиотека base-gui
Описание компонентов библиотеки base-gui
 • Оператор SELECT
Использование SQL-оператора SELECT
в помощь разработчикам Swing-приложений

JCheckBox в таблице Grid

В статье рассмотрен пример (example-grid-check) создания таблицы с размещением в одной из колонок компонента JCheckBox с использованием библиотеки base-gui. Создание таблицы и представление в ней записей с использованием модуля base-gui рассмотрено в Примере таблицы Grid. В этом примере будет рассмотрена возможность выделения записей таблицы с использованием редактируемого компонента JCheckBox в ячейках колонки.

К отличительной особенности данного примера следует отнести динамическую загрузку модуля base-gui. Для старта примера не требуется ни в командной строке указывать требуемый jar-модуль, ни в манифесте META-INF/MANIFEST.MF прописывать 'classpath'. Динамическую загрузку jar-файлов можно использовать для создания многомодульного приложения, описанного на странице Pluggable решение. Но необходимо отметить, что этот механизм создания многомодульных приложений не следует распространять на групповую разработку; лучше использовать OSGi технологию.

На следующем скриншоте представлен интерфейс примера. После выделения одной или нескольких записей в таблице и нажатия кнопки 'Выбрать записи' открывается окно с сообщением о выделенных строках набора (отсчет номера строки от 0).

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

Пример включает 2 класса : интерфейсный класс ExampleGridCheck и загрузочный класс ExampleGridMain. Описание ExampleGridCheck будет представлено следующим образом :

  1. Описание полей : поля настройки таблицы и массив данных;
  2. Методы создания интерфейса;
  3. Чтение выделенных строк;
  4. Конструктор ExampleGridCheck.

Интерфейсный класс примера ExampleGridCheck не включает метод void main(String[] args). Для старта примера используется ExampleGridMain, динамически загружающий jar-файлы и стартующий класс ExampleGridCheck.

1. Описание полей

Поля описания таблицы включают объект таблицы grid, массивы типов значений в колонках (classes) и заголовков колонок таблицы (columnsTitle). Наборы данных для таблицы представлен полем data, имеющий тип Object[][]. Массив data загружается в таблицу после инсталляции.

private IGrid  grid;

// типы значений в колонках таблицы
private Class<?>[] classes = {String.class  , 
                              Float.class   , 
                              Boolean.class};
// наименование и заголовки колонок таблицы
private String[] columnsTitle  = {"Наименование",
                                  "Количество"  , 
                                  "Выбор"      };

private  Object[][] data = {{"Йогурт" , 0.5f, false},
                            {"Молоко" , 0.9f, false},
                            {"Кефир"  , 0.5f, false},
                            {"Ряженка", 0.5f, true }};

2. Формирование интерфейса

Для создания интерфейса используем 2 метода : формирование таблицы методом createGrid и создание кнопки методом createButton.

При создании таблицы типа Grid используются массивы типов колонок и наименований колонок. Поскольку в примере локализация не предусматривается, то массив наименований колонок используется и для заголовков. После создания таблицы grid определяется колонка с компонентами JCheckBox методом addCheckBoxEditor, которому в качестве параметра передается номер колонки. В таблице можно использовать только одну редактируемую колонку с JCheckBox; тип значений для данной колонки должен быть Boolean.

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

После создания таблицы устанавливаются размеры колонок и возможность перемещения колонок таблицы блокируется.

private void createGrid()
{
    grid = new Grid(classes, columnsTitle, columnsTitle);

    // определение колонки с компонентом JCheckBox
    grid.addCheckBoxEditor(2);

    grid.setColumnsWidth(new int[] {220, 90, 90});
    grid.setReorderingAllowed(false);
}

private JPanel createButton()
{
    JButton btnChooser = new JButton("Выбрать записи");
    btnChooser.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            ChoosedRows();
        }
    });
    // Панель с кнопкой
    JPanel pnlButtons = new JPanel();
    pnlButtons.add(btnChooser);
    return pnlButtons;
}

Метод createButton формирует панель управления типа JPanel и размещает на ней кнопку btnChooser. К кнопке подключается обработчик событий, вызывающий метод ChoosedRows.

3. Чтение выделенных строк

Метод ChoosedRows вызывается при нажатии на кнопку. В методе определяются выделенные в таблице строки вызовом функции getCheckedRows, которая возвращает массив int[]. Для вывода сообщения используется диалоговое окно JOptionPane.

private void ChoosedRows()
{
    // Выделенные строки
    int[] rows = grid.getCheckedRows();
    String msg = "";
    for (int i = 0; i < rows.length; i++) {
        if (msg.length() > 0)
            msg += ", ";
        msg += String.valueOf(rows[i]);
    }
    String title = "Выделенные строки"; 
    if (msg.length() > 0) {
        msg = "Вы выбрали следующие строки : " + msg;
        showMessage (msg);
    } else
        showMessage ("Вы не выбрали ни одной строки");
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
private void showMessage (final String msg)
{
    String title = "Выделенные строки"; 
    JOptionPane.showMessageDialog(ExampleGridCheck.this,
                                  msg, title, 
                       JOptionPane.INFORMATION_MESSAGE);
}

4. Интерфейсный класс ExampleGridCheck

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

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

    public ExampleGridCheck()
    {
        super("Grid width CheckBox");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        createGid();
        getContentPane().add(grid.asWidget (), 
                                    BorderLayout.CENTER);
        getContentPane().add(createControls(), 
                                    BorderLayout.SOUTH);
        setSize(520, 360);
        // Загрузка данных
        grid.addRecords(drink);
        setVisible(true);
    }
}

Класс ExampleGridCheck не имеет метода "main(String[] args)" и будет стартован загрузочным классом ExampleGridMain.

Главный класс ExampleGridMain

ExampleGridMain реализует механизм динамической загрузки многомодульного java-приложения. Для этого используется рефлексия (reflection).

В главном методе "main(String[] args)" класса ExampleGridMain формируется массив urls из jar-файлов поддиректории lib, содержащий модуль base-gui, и для них определяется загрузчик loader. После этого формируется загрузчик для главного jar-файла (example-grid-check.jar), определяется интерфейсный класс org.jabricks.basegui.examples.ExampleGridCheck и создается экземпляр (newInstance). При необходимости Вы можете вызвать конкретный метод класса, как это представлено в комментированных строках.

К достоинствам данного подхода следует отнести возможность изменения набора jar-модулей без перекомпиляции главного jar-файла.

import java.io.*;

import java.lang.reflect.Method;

import java.net.URL;
import java.net.URLClassLoader;
import java.net.MalformedURLException;

import java.lang.ClassLoader;

public class ExampleGridMain
{
    private static final long serialVersionUID = 1L;

    public ExampleGridMain() {}

    public static void main(String[] args) throws Exception
    {
        File commonsDir = new File("lib");

        File[] entries = commonsDir.listFiles();
        URL[] urls = new URL[entries.length];

        for (int i = 0; i < entries.length; i++)
            urls[i] = entries[i].toURI().toURL();

        URLClassLoader loader
        loader = new URLClassLoader(urls, null);

        File file = new File(".");
        String path = "jar:file:/"+file.getCanonicalPath();
        URL url = new URL(path+"/example-grid-check.jar!/");

        URLClassLoader appLoader;
        appLoader=new URLClassLoader(new URL[]{url},loader);

        String cls;
        cls="org.jabricks.basegui.examples.ExampleGridCheck";
        Class appClass = appLoader.loadClass(cls);
        appClass.newInstance();
//      Object appInstance = appClass.newInstance();
//      Method m = appClass.getMethod("start");
//      m.invoke(appInstance);
    }
};

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

Архив примера включает командный файл run-example-grid-check для старта example-grid-check.jar в Windows. Пользователи Linux должны создать свой командный файл старта примера. Обратите внимание, что команда запуска примера не включает classpath с jar-файлами. Также модуль base-gui-1.0.0.jar не прописан в classpath манифеста примере META-INF/MANIFEST.MF.

Поскольку пример представляет запускаемый jar-файл (runable), то он может быть стартован и обычным способом (не из консоли) двойным нажатием.

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

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

  Рейтинг@Mail.ru