Материал: Портянкин И. Swing

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

520

ГЛАВА 17

Простая настройка внешнего вида

Мы только что видели, как парой строк кода без привлечения особенных мощностей

ивнутренних ресурсов класса JTable и его «сотрудников» можно создать вполне достойные таблицы. Аналогичные действия можно проделать и при изменении внешнего вида таблицы, причем внешний вид можно поменять полностью, вплоть до переписывания UIпредставителя класса JTable, однако есть путь и попроще. С помощью нескольких полезных свойств можно буйно раскрасить таблицу, использовать различные цвета для текста

ивыделения, настроить сетку таблицы, задать разные расстояния между ячейками. Бывает, что этого хватает для получения той самой эффектной таблицы, которая вам нужна.

Рассмотрим несложный пример с парой таблиц, внешний вид которых мы изменим с помощью некоторых свойств класса JTable. Запустив программу с этим примером, вы воочию убедитесь, как именно влияют те или иные свойства на внешний вид таблиц, а затем мы обсудим их подробнее:

//SimpleTablesLook.java

//Небольшое изменение внешнего вида таблиц

import javax.swing.*; import java.awt.*;

public class SimpleTablesLook extends JFrame { // данные и заголовки для таблицы

private Object[][] data = new String[][] {

{"Мощная", "Синий", "Спортивный" },

{"Экономичная", "Красный", "Классика" }

};

private Object[] columns = new String[] { "Модель", "Цвет", "Дизайн"

};

public SimpleTablesLook() { super("SimpleTablesLook"); setDefaultCloseOperation(EXIT_ON_CLOSE);

//таблица с разными расстояниями между ячейками

JTable table1 = new JTable(data, columns);

//настройка расстояний и цветов table1.setRowHeight(40); table1.setIntercellSpacing(new Dimension(10, 10)); table1.setGridColor(Color.green); table1.setShowVerticalLines(false);

//таблица с разными цветами

JTable table2 = new JTable(data, columns); table2.setForeground(Color.red); table2.setSelectionForeground(Color.yellow); table2.setSelectionBackground(Color.blue); table2.setShowGrid(false);

Таблицы

521

//добавляем таблицы в панель из двух ячеек setLayout(new GridLayout(1, 2, 5, 5)); add(new JScrollPane(table1));

add(new JScrollPane(table2));

//выводим окно на экран

setSize(600, 200); setVisible(true);

}

public static void main(String[] args) { SwingUtilities.invokeLater(

new Runnable() {

public void run() { new SimpleTablesLook(); } });

}

}

В примере мы создаем небольшое окно, в котором разместятся две таблицы. Данные для обеих таблиц одинаковы, они описаны в виде двух массивов: двухмерного data, в нем хранится информация о ячейках таблицы, и одномерного columns, в котором мы разместили названия столбцов таблицы. Первая таблица table1 демонстрирует некоторые свойства класса JTable, позволяющие управлять расстоянием между ячейками, высотой строк таблицы, а также цветом и стилем сетки таблицы. Вторая таблица table2 демонстрирует, как можно изменить цвета, используемые для вывода текста и выделенных элементов, и как отключить прорисовку сетки таблицы. Обе таблицы размещаются в панелях прокрутки и добавляются в окно с установленным табличным расположением, при котором панель разбивается на две ячейки одинакового размера с небольшим (в 5 пикселов) расстоянием между ними. После этого остается только вывести наше окно на экран.

Запустив программу с примером, вы сможете увидеть изменения во внешнем виде таблиц и оценить, в каких ситуациях подобное изменение внешнего вида может вам понадобится. Давайте опишем использованные в примере свойства немного подробнее, так чтобы они всегда были у вас «под рукой» (табл. 17.1).

Таблица 17.1. Свойства, меняющие внешний вид таблицы JTable

Свойства

Краткое описание

selectionBackground, Управляют цветами прорисовки фона выделенной ячейки (первое selectionForeground свойство) и текста выделенной ячейки (второе свойство). Вкупе со стандартными свойствами background и foreground, отвечающими за

фон и цвет любого компонента Swing, позволяют полно настроить

цветовую гамму таблицы

522

ГЛАВА 17

Таблица 17.1 (продолжение)

 

 

Свойства

Краткое описание

 

 

rowHeight, intercellSpacing

Первое свойство позволяет задать высоту сразу всех строк табли-

 

цы или (с помощью перегруженного метода set) отдельно некоторой

 

строки таблицы. Второе свойство управляет расстоянием между

 

ячейками как по оси X, так и по оси Y (в примере вы можете видеть,

 

что задается это расстояние в виде объекта Dimension)

showVerticalLines,

С помощью этих свойств вы можете указывать таблице, как и какие

showHorizontalLines,

линии сетки следует рисовать. Первые два свойства по отдельности

showGrid

управляют прорисовкой вертикальных и горизонтальных линий сетки

 

таблицы, а третье свойство позволяет «одним махом» показать или

 

скрыть всю сетку таблицы

gridColor

Позволяет задать цвет сетки таблицы JTable (вы могли видеть, как ис-

 

пользовать это свойство, в рассмотренном нами примере)

С помощью перечисленных свойств вы сможете быстро и без особых усилий настроить некоторые аспекты внешнего вида таблицы JTable, иногда именно это нужно интерфейсу программы. Далее, читая эту главу, мы узнаем множество других немного более сложных, но и более тонких способов настройки внешнего вида таблицы, а точнее, ее ячеек.

Модели таблицы JTable

Для правильной работы таблица JTable нуждается сразу в трех моделях, поставляющих ей данные и при изменении этих данных сохраняющих изменения. Первая и самая важная модель, о которой мы уже упоминали в начале главы, хранит непосредственно данные ячеек таблицы, а также дополнительную служебную информацию об этих ячейках. Обязанности этой модели описываются интерфейсом TableModel, который довольно прост, и реализовать его самому не представляет особого труда. Вторая модель управляет столбцами таблицы и описана в интерфейсе TableColumnModel. Столбцы очень важны для любой таблицы: вспомним, что, как правило, строки таблицы представляют собой различные наборы однотипных данных, а столбцы описывают тип хранимых в строках данных и порядок их следования. Именно столбцы определяют, какой набор данных отображает таблица, данные в таблице сортируются по столбцам, так что отдельная модель для столбцов не является не роскошью. Модель столбцов таблицы TableColumnModel позволяет добавлять, перемещать, находить столбцы, узнавать об изменениях в их данных или расположении, с ее помощью также можно изменить расстояние между столбцами

инаходящимися в них ячейками, изменить модель выделения столбцов. Наконец, третья

ипоследняя модель таблицы нам хорошо знакома еще с главы 11, в которой мы знакомились со списками библиотеки Swing — это модель выделения списка ListSelectionModel.

Она управляет выделением строк таблицы и не затрагивает столбцы, в модели которых TableColumnModel есть собственная модель выделения (в качестве последней используется все та же модель выделения списка ListSelectionModel). Так что формально можно говорить о четырех моделях таблицы JTable, просто одна из этих моделей вызывается неявно, через другую модель. Помимо моделей таблица JTable предоставляет еще несколько удобных механизмов выделения строк, столбцов и ячеек; вскоре мы о них узнаем.

Нет ничего удивительного в том, что у вас имеется широкий выбор альтернатив при работе с моделями, в этом заключается сама суть Swing. Вы можете использовать для каждой из них соответствующий абстрактный класс, начинающийся со слова Abstract, в котором тщательно реализованы поддержка слушателей и рассылка событий. Наследуя от такого класса, вам остается только наполнить модель данными, применяя удобные способы и инструменты, и в нужные моменты оповещать присоединенных слушателей

Таблицы

523

об изменениях в данных. Для каждой из моделей таблицы JTable имеется стандартная реализация (класс, название которого начинается со слова Default), хорошо подходящая в тех случаях, когда вам требуется модель, но нет причин или желания писать собственную . Впрочем, никто не отбирает у вас право полностью, «с нуля», написать свою модель и реализовать ее нужным образом. Перейдем теперь непосредственно к работе с моделями и изучим возможности каждой из них.

Модель данных TableModel

Модель TableModel позволяет полно описать каждую ячейку таблицы JTable. Определенные в ней методы дают возможность таблице получить значение произвольной ячейки и изменить его (модель данных таблицы считается изменяемой, для этого не нужно проводить дополнительных действий или реализовывать новых интерфейсов), узнать о том, можно ли пользователю редактировать ячейки, получить исчерпывающую информацию о столбцах (их количестве, названиях и типе) и строках. Нам, со своей стороны, нужно определить эти методы и с их помощью передать таблице все подготовленные данные.

Прежде чем начать разработку собственной модели, можно рассмотреть вариант использования стандартной модели DefaultTableModel. Если вы вспомните первый пример данной главы, где мы создавали простые таблицы с помощью удобных конструкторов, то там таблица JTable неявно создавала и наполняла переданными в конструктор данными именно стандартную модель DefaultTableModel. Модель DefaultTableModel хранит переданные ей данные в двух векторах Vector, примерно так, как мы это делали в первом примере для одного из конструкторов таблицы: в одном из векторов хранятся такие же вектора,

вкоторых в свою очередь хранятся данные строк, а во втором векторе хранятся названия столбцов таблицы. Если вам безразличны структура и способ получения отображаемых в таблице данных, лучше ограничиться стандартной моделью. С другой стороны, у вас остается не так много рычагов управления данными таблицы: все ячейки окажутся редактируемыми, у вас не будет способа тонко настроить тип данных для определенного столбца, то есть таблица будет иметь довольно безликий вид. К недостаткам стандартной модели можно отнести также некоторый архаизм: класс DefaultTableModel появился еще

всамом первом выпуске Swing для JDK 1.1 и использует для хранения данных класс Vector,

устаревший и уступающий по многим показателям новым контейнерам данных (таким как список ArrayList). Так что во многих ситуациях лучше написать собственную модель.

Впрочем, применение стандартной модели все равно остается самым быстрым способом создать таблицу и наполнить ее данными (и вы можете разделять ее между видами и отдельно от пользовательского интерфейса обрабатывать хранящиеся в ней данные). Рассмотрим небольшой пример, который продемонстрирует некоторые возможности стандартной модели:

//UsingDefaultTableModel.java

//Использование стандартной модели при создании таблицы import javax.swing.*;

import javax.swing.table.*; import java.awt.event.*; import java.awt.*;

public class UsingDefaultTableModel extends JFrame { // наша модель

private DefaultTableModel dtm; public UsingDefaultTableModel() {

524

ГЛАВА 17

super("UsingDefaultTableModel"); setDefaultCloseOperation(EXIT_ON_CLOSE);

//создаем стандартную модель dtm = new DefaultTableModel();

//задаем названия стоблцов dtm.setColumnIdentifiers(

new String[] {"Номер", "Товар", "Цена"});

//наполняем модель данными

dtm.addRow(new String[] {"№1", "Блокнот", "5.5"}); dtm.addRow(new String[] {"№2", "Телефон", "175"}); dtm.addRow(new String[] {"№3", "Карандаш", "1.2"});

//передаем модель в таблицу

JTable table = new JTable(dtm);

//данные могут меняться динамически

JButton add = new JButton("Добавить"); add.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) { // добавляем новые данные

dtm.addRow(

new String[] {"?", "Новинка!", "Супер Цена!"});

}

});

JButton remove = new JButton("Удалить"); remove.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) { // удаляем последнюю строку (отсчет с нуля) dtm.removeRow(dtm.getRowCount() — 1);

}

});

//добавляем кнопки и таблицу add(new JScrollPane(table)); JPanel buttons = new JPanel(); buttons.add(add); buttons.add(remove); add(buttons, "South");

//выводим окно на экран setSize(300, 300); setVisible(true);

}

public static void main(String[] args) { SwingUtilities.invokeLater(

new Runnable() {

Источник: https://studfile.net/preview/15935977/