который должен выполнять любой редактор ячеек таблицы. Этот метод формирует компонент, пригодный для редактирования, например объект класса 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.
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;
}
}
Г-Редактор строки | В®®’ | |
Сотрудник | Сведения | |
Имя | Иван | - |
Фамилия | Петров | |
Пол | Мч/жпклй т | |
МужскойЖенский | ■а |
Рис. 13.3. Компонент JComboBox в ячейке таблицы
Сортировка строк таблицы
JTable table = new JTable(); table.setAutoCreateRowSorter(true);