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