/**
* <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用于通知感興趣的參與者事件源中的狀態(tài)已發(fā)生更改 */
private ChangeEvent changeEvent = new ChangeEvent(this);
/**
*<ul>
*<li>Description:[構(gòu)造方法]</li>
*<ul>
*/
public FileFieldEditor(String[] fileFields)
{
super();
for(String fileField : fileFields)
{
this.addItem(fileField);
}
// 請(qǐng)求終止編輯操作可以包含單元格的JTable收到,也可以從編輯器組件本身(如這里的JComboBox)獲得
/*
* addActionListener(newActionListener(){ publicvoid
* actionPerformed(ActionEvent e) {
* System.out.println("ActionListener");
* //如同stopCellEditing,都是調(diào)用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,是因?yàn)橐粋€(gè)為CellEditorListener.class(Class對(duì)象),
// 接著的是一個(gè)CellEditorListener的實(shí)例
listener = (CellEditorListener) listeners[i + 1];
// 讓changeEvent去通知編輯器已經(jīng)結(jié)束編輯
// 在editingStopped方法中,JTable調(diào)用getCellEditorValue()取回單元格的值,
// 并且把這個(gè)值傳遞給TableValues(TableModel)的setValueAt()
listener.editingStopped(changeEvent);
}
}
}
public void cancelCellEditing()
{}
/**
* 編輯其中一個(gè)單元格,再點(diǎn)擊另一個(gè)單元格時(shí),調(diào)用。
*/
public boolean stopCellEditing()
{
// 可以注釋掉下面的fireEditingStopped();然后在GenderEditor的構(gòu)造函數(shù)中把
// addActionListener()的注釋去掉(這時(shí)請(qǐng)求終止編輯操作從JComboBox獲得),
// System.out.println("編輯其中一個(gè)單元格,再點(diǎn)擊另一個(gè)單元格時(shí),調(diào)用。");
// 請(qǐng)求終止編輯操作從JTable獲得
fireEditingStopped();
return true;
}
/**
* 為一個(gè)單元格初始化編輯時(shí),getTableCellEditorComponent被調(diào)用
*/
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column)
{
String s = String.valueOf(value);
setSelectedItem(s);
return this;
}
/**
* 詢問編輯器它是否可以使用 anEvent 開始進(jìn)行編輯。
*/
public boolean isCellEditable(EventObject anEvent)
{
return true;
}
/**
* 如果應(yīng)該選擇正編輯的單元格,則返回true,否則返回 false。
*/
public boolean shouldSelectCell(EventObject anEvent)
{
return true;
}
/**
* 返回值傳遞給TableValue(TableModel)中的setValueAt()方法
*/
public Object getCellEditorValue()
{
return this.getSelectedItem().toString();
}
}