logo
Хабибуллин

Визуализация ячеек таблицы

Непосредственным выводом содержимого ячеек на экран — его визуализацией — занимается еще один делегат класса JTable, описанный интерфейсом TableCellRenderer.

Интерфейс TableCellRenderer описывает всего один метод:

Component getTableCellRendererComponent( JTable table, Object value,

boolean isSelected, boolean hasFocus, int row, int col);

Как видно из описания, для каждой ячейки с индексами (row, col) можно задать свой способ визуализации. Этот способ может также меняться в зависимости от содержимого value ячейки, от того, выделена ли ячейка isSelected, имеет ли она фокус ввода hasFocus, и даже от того, какая таблица table использует этот метод. По этим данным метод должен сформировать компонент, содержащий значение value, и вернуть его. Обычно возвращается объект класса, определяющего этот метод, т. е. this. Затем полученный объект рисует себя на экране своим методом paint(). Поэтому удобно реализовать интерфейс каким-нибудь графическим компонентом, имеющим метод paint().

Все это похоже на визуализацию элементов списка JList, описанную в главе 11.

Вбиблиотеке Swing интерфейс TableCellRenderer реализован классом

DefaultTableCellRenderer, расширяющим класс JLabel. Но класс DefaultTableCellRenderer

не реализует даже все возможности класса JLabel, например не отображаются изображения типа Icon. Используется только метод setText(String) класса JLabel в таком виде:

protected void setValue(Object value){ setText((value == null) ? "" : value.toString());

}

Это означает, что, хотя ячейка таблицы может содержать любой объект, на экране появляется только строка, полученная методом toString() этого объекта.

Для того чтобы показать графические объекты, хранящиеся в ячейках таблицы, в графическом виде, чаще всего достаточно переопределить метод setValue(Object) класса DefaultTableCellRenderer. Например, в программе листинга 13.2 объекты класса Color выводятся текстовой строкой, как видно на рис. 13.1. Чтобы в ячейке показать цвет, надо расширить класс DefaultTableCellRenderer, переопределив его метод setValue():

class ColorRenderer extends DefaultTableCellRenderer{ public void setValue(Object value){