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. |
