410013796724260
• Webmoney
R335386147728
Z369087728698
в помощь разработчикам 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 будет представлено следующим образом :
Интерфейсный класс примера 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. Главный класс ExampleGridMainExampleGridMain реализует механизм динамической загрузки многомодульного 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. |