410013796724260
• Webmoney
R335386147728
Z369087728698
в помощь разработчикам Swing-приложений
Пример таблицы GridВ статье рассмотрен пример создания таблицы и представления в ней набора записей example-grid. В примере продемонстрировано :
В качестве компонента таблицы используеся класс org.jabricks.basegui.grid.Grid модуля base-gui. Управление настройками и данными таблицы будет осуществляться с помощью API таблицы (интерфейс org.jabricks.basegui.grid.IGrid). На следующем скриншоте представлен интерфейс примера после старта. Таблица располагается в центральной части формы. В нижней части формы размещаются кнопки управления. 1. Описание примераОписание исходного кода примера (класса ExampleGrid) разделим на несколько частей :
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. |