/**
* <ul>
* <li>Title:[FileFieldEditor]</li>
* <li>Description: [JTable可编辑]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2012-12-6]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
@SuppressWarnings("serial")
public class FileFieldEditor extends JComboBox implements TableCellEditor
{
/** EventListenerList:保存EventListener 列表的类 */
private EventListenerList listenerList = new EventListenerList();
/** ChangeEvent用于通知感兴趣的参与者事件源中的状态已发生更改 */
private ChangeEvent changeEvent = new ChangeEvent(this);
/**
*<ul>
*<li>Description:[构造方法]</li>
*<ul>
*/
public FileFieldEditor(String[] fileFields)
{
super();
for(String fileField : fileFields)
{
this.addItem(fileField);
}
// 请求终止编辑操作可以包含单元格的JTable收到,也可以从编辑器组件本身(如这里的JComboBox)获得
/*
* addActionListener(newActionListener(){ publicvoid
* actionPerformed(ActionEvent e) {
* System.out.println("ActionListener");
* //如同stopCellEditing,都是调用fireEditingStopped()方法 fireEditingStopped(); }
* });
*/
}
public void addCellEditorListener(CellEditorListener l)
{
listenerList.add(CellEditorListener.class, l);
}
public void removeCellEditorListener(CellEditorListener l)
{
listenerList.remove(CellEditorListener.class, l);
}
private void fireEditingStopped()
{
CellEditorListener listener;
Object[] listeners = listenerList.getListenerList();
for (int i = 0; i < listeners.length; i++)
{
if (listeners[i] == CellEditorListener.class)
{
// 之所以是i+1,是因为一个为CellEditorListener.class(Class对象),
// 接着的是一个CellEditorListener的实例
listener = (CellEditorListener) listeners[i + 1];
// 让changeEvent去通知编辑器已经结束编辑
// 在editingStopped方法中,JTable调用getCellEditorValue()取回单元格的值,
// 并且把这个值传递给TableValues(TableModel)的setValueAt()
listener.editingStopped(changeEvent);
}
}
}
public void cancelCellEditing()
{}
/**
* 编辑其中一个单元格,再点击另一个单元格时,调用。
*/
public boolean stopCellEditing()
{
// 可以注释掉下面的fireEditingStopped();然后在GenderEditor的构造函数中把
// addActionListener()的注释去掉(这时请求终止编辑操作从JComboBox获得),
// System.out.println("编辑其中一个单元格,再点击另一个单元格时,调用。");
// 请求终止编辑操作从JTable获得
fireEditingStopped();
return true;
}
/**
* 为一个单元格初始化编辑时,getTableCellEditorComponent被调用
*/
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column)
{
String s = String.valueOf(value);
setSelectedItem(s);
return this;
}
/**
* 询问编辑器它是否可以使用 anEvent 开始进行编辑。
*/
public boolean isCellEditable(EventObject anEvent)
{
return true;
}
/**
* 如果应该选择正编辑的单元格,则返回true,否则返回 false。
*/
public boolean shouldSelectCell(EventObject anEvent)
{
return true;
}
/**
* 返回值传递给TableValue(TableModel)中的setValueAt()方法
*/
public Object getCellEditorValue()
{
return this.getSelectedItem().toString();
}
}