Читаем 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.

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

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

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