Читаем Java 7 полностью

Для того чтобы этот способ визуализации применялся только к объектам класса Color, следует обратиться к методу setDefaultRenderer(Class, TableCellRenderer) класса JTable. В примере листинга 13.2 в конструктор класса SimpTable надо вставить строку

t1.setDefaultRenderer(Color.class, new ColorRenderer());

Этот метод можно применить несколько раз для разных классов, задав таким путем свой класс-рисовальщик для объекта каждого класса. Например, можно выводить на экран изображения, хранящиеся в ячейках таблицы, определив класс:

class IconRenderer extends DefaultTableCellRenderer{

public void setValue(Object value){ setIcon((Icon)value); }

}

и добавив строку

t1.setDefaultRenderer(Icon.class, new IconRenderer());

Возможности класса JLabel, который фактически рисует на экране содержимое ячеек таблицы в классе DefaultTableCellRenderer, ограничены. Для более сложного вывода на экран следует непосредственно реализовать интерфейс TableCellRenderer. Листинг 13.5 показывает, как можно реализовать его для вывода многострочных ячеек, воспользовавшись текстовой областью класса JTextArea, описанного в главе 12.

Листинг 13.5. Несколько строк в одной ячейке таблицы

import java.awt.*; import javax.swing.*; import javax.swing.table.*; import javax.swing.border.*; import java.util.*;

public class MultiLineTable extends JFrame{ MultiLineTable(int lineCount){

super(" Таблица с многострочными ячейками");

// Расширяем модель ячеек, переопределяя метод,

// возвращающий класс содержимого столбца DefaultTableModel tm = new DefaultTableModel(){ public Class getColumnClass(int col){ return getValueAt(0, col).getClass();

}

};

// Заносим в модель ячеек данные tm.setDataVector( new Obj ect [][] {

{"Имя\иФамилия","Иван\иПетров",,,Петр\пИванов"}, {"Отдел\пДолжность", "Сбыгт\пВодитель", "Сбы1т\пЭкспедитор"}

},

new Object[] {,,Данные,,,,,1,,,,,2"}

// Создаем таблицу с новой моделью ячеек

JTable t = new JTable(tm);

// Изменяем выюоту ячеек на экране, чтобы1 поместились // все строки содержимого ячейки t.setRowHeight( t.getRowHeight() * lineCount);

// Устанавливаем новым класс-рисовальщик t.setDefaultRenderer(String.class, new MultiLineCellRenderer());

add(new JScrollPane(t));

setSize(400, 400);

setDefaultCloseOperation(JFrame.EXIT ON CLOSE); setVisible(true);

} public static void main(String[] args){

new MultiLineTable(2);

}

}

// Класс-рисовальщик

class MultiLineCellRenderer extends JTextArea implements TableCellRenderer{

public MultiLineCellRenderer(){ setLineWrap(true); setWrapStyleWord(true); setOpaque(true);

}

public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col){ if (isSelected){

setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); }else{

setForeground(table.getForeground()); setBackground(table.getBackground());

}

if (hasFocus){

setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); if (table.isCellEditable(row, col)){

setForeground(UIManager.getColor("Table.focusCellForeground"));

setBackground( UIManager.getColor("Table.focusCellBackground"));

}

}else setBorder(new EmptyBorder(1, 2, 1, 2)); setFont(table.getFont());

setText((value == null) ? "" : value.toString()); return this;

}

}

Часто требуется поместить несколько строк в заголовки столбцов таблицы. Для этого можно воспользоваться программой листинга 13.5, написав новый метод

getTableCellRendererComponent() :

public Component getTableCellRendererComponent(

JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col){

if (table != null){

JTableHeader header = table.getTableHeader(); if (header != null){

setForeground(header.getForeground()); setBackground(header.getBackground()); setFont(header.getFont());

}

}

setText((value == null) ? "" : value.toString()); setBorder(UIManager.getBorder("TableHeader.cellBorder")); return this;

}

Затем надо установить экземпляр измененного класса (назовем его MultiLineHeader) в заголовок каждого столбца, взяв заголовки из модели заголовков таблицы:

MultiLineHeader mlh = new MultiLineHeader();

Enumeration e = t.getColumnModel().getColumns(); while (e.hasMoreElements())

((TableColumn)e.nextElement()).setHeaderRenderer(mlh);

Редактор ячеек таблицы

По умолчанию таблица создается редактируемой. Это означает, что содержимое ее ячеек можно изменять вводом новых значений с клавиатуры. Для редактирования ячеек используется еще один класс-делегат. Им может стать любой класс, реализующий интерфейс TableCellEditor.

Интерфейс TableCellEditor расширяет интерфейс cellEditor и добавляет к его методам только один метод

public Component getTableCellEditorComponent(JTable table,

Object value, boolean isSelected, int row, int column);

Перейти на страницу:

Все книги серии В подлиннике

Java 7
Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др. Дано подробное изложение последней версии сервлетов, технологии JSP и библиотек тегов JSTL. Около двухсот законченных программ иллюстрируют рассмотренные приемы программирования. Приведена подробная справочная информация о классах и методах Core Java API.

Ильдар Шаукатович Хабибуллин

Программирование, программы, базы данных

Похожие книги

C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
Разработка ядра Linux
Разработка ядра Linux

В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.

Роберт Лав

Программирование, программы, базы данных / Программирование / Книги по IT