Для того чтобы этот способ визуализации применялся только к объектам класса 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, описанного в
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);