который должен выполнять любой редактор ячеек таблицы. Этот метод формирует компонент, пригодный для редактирования, например объект класса JTextField, для заданной ячейки с индексами (row, column) и содержимым value. Дополнительно указывается таблица table, в которой происходит редактирование. Метод может учесть параметр isSelected, показывающий, выделена ячейка или нет.

Сам же интерфейс CellEditor описывает несколько методов, из которых наиболее важны два. Один из них- логический метод stopCellEditing() - возвращает true, если

редактирование ячейки завершено и следует сохранить сделанные изменения. Он возвращает false, если редактирование еще не завершено. В это время удобно сделать проверку измененной ячейки. Второй метод cancelCellEditing () отменяет редактирование.

При изменении содержимого ячейки происходит событие класса ChangeEvent, которое можно отследить, присоединив к редактору слушателя события методом

addCellEditorListener(CellEditorListener).

Интерфейс TableCellEditor реализован классом DefaultCellEditor. Конструкторы этого класса применяют в качестве конкретных редакторов компоненты JCheckBox, JComboBox и JTextField.

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

Компонент JCheckBox используется для изображения в виде флажка логического содержимого ячейки типа boolean, как показано на рис. 13.1. Этот редактор позволяет изменять истинность содержимого ячейки.

Компонент JComboBox применяется для ввода в ячейку одного из нескольких значений, содержащихся в раскрывающемся списке.

В листинге 13.6 приведен пример программы, позволяющей устанавливать разные редакторы для изменения содержимого различных ячеек таблицы. В примере ячейка в третьей строке и во втором столбце редактируется компонентом JComboBox. Результат показан на рис. 13.3.

Листинг 13.6. Разные редакторы ячеек таблицы

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

public class RowEd extends JFrame{ public RowEd(){

super(, Редактор строки,);

DefaultTableModel dm = new DefaultTableModel(); dm.setDataVector(

new Object[] [Н^Имя11, ''Иван'1},

{''Фамилия'', ''Петров'1},

{''Пол'', ''Мужской''}}, new Object[]{"Cотрудник", ''Сведения''});

JTable table = new JTable(dm);

JComboBox cb = new JComboBox(); cb. addItem (''Мужской'') ; cb.addItem('Женский');

RowEditor rowEd = new RowEditor(table); rowEd.setEditorAt(2, new DefaultCellEditor(cb)); table.getColumn('Сведения').setCellEditor(rowEd);

add(new JScrollPane(table)); setSize(400, 100); setVisible(true);

}

public static void main(String[] args){ new RowEd();

}

}

class RowEditor implements TableCellEditor{

protected Hashtable editors;

protected TableCellEditor editor, defEditor;

JTable table;

public RowEditor(JTable table){ this.table = table; editors = new Hashtable();

defEditor = new DefaultCellEditor(new JTextField());

}

public void setEditorAt(int row, TableCellEditor editor){ editors.put(new Integer(row), editor);

}

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column){

return editor.getTableCellEditorComponent(table, value, isSelected, row, column);

}

public Object getCellEditorValue(){ return editor.getCellEditorValue();

}

public boolean stopCellEditing(){ return editor.stopCellEditing();

public void cancelCellEditing(){ editor.cancelCellEditing();

}

public boolean isCellEditable(EventObject anEvent){ selectEditor((MouseEvent)anEvent); return editor.isCellEditable(anEvent);

}

public void addCellEditorListener(CellEditorListener l){ editor.addCellEditorListener(l);

}

public void removeCellEditorListener(CellEditorListener l){ editor.removeCellEditorListener(l);

}

public boolean shouldSelectCell(EventObject anEvent){ selectEditor((MouseEvent)anEvent); return editor.shouldSelectCell(anEvent);

}

protected void selectEditor(MouseEvent e){ int row = (e == null) ?

table.getSelectionModel().getAnchorSelectionIndex() : table.rowAtPoint(e.getPoint());

editor = (TableCellEditor)editors.get(new Integer(row)); if (editor == null) editor = defEditor;

}

}

Г-Редактор строкиВ®®’
СотрудникСведения
ИмяИван-
ФамилияПетров
ПолМч/жпклй т4
МужскойЖенский■а

Рис. 13.3. Компонент JComboBox в ячейке таблицы

Сортировка строк таблицы

Вы знаете, что, работая с электронными таблицами, такими как MS Excel, можно отсортировать строки таблицы по какому-нибудь столбцу, просто щелкнув мышью по заголовку столбца. Повторный щелчок вызовет сортировку в обратном порядке.Такая возможность есть и в классе JTable. Самый простой способ реализовать ее — это включить сортировку методом setAutoCreateRowSorter(true):

JTable table = new JTable(); table.setAutoCreateRowSorter(true);

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

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

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