JTable可编辑

JTable可编辑
/**
 * <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();
    }
}

你可能感兴趣的:(JTable可编辑)