package test;

import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.util.EventObject;

import javax.swing.AbstractCellEditor;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;

class ComBoxEditor extends AbstractCellEditor implements TableCellEditor
{
	/*
	*	ReadMe: 这个 ComboBox下拉列表的编辑器 使用一个 JLable 和一个 JComboBox组合的
	*	将JComboBox放到JLable里,所以只需要将 JLable 作为编辑器组件返回就行了
	*/
	private JComboBox m_ComboBox;
	//获取 下拉列表的 选择的值
	private String m_SelStr;
	private JLabel m_OutLable;
	//这里我们设置 鼠标点击 1 次就响应编辑器
	private static final int clickCountToStart = 1;
	//初始化编辑器包含的控件信息
	public ComBoxEditor()
	{
		m_ComboBox = new JComboBox();
		m_ComboBox.addItem("选项A");
		m_ComboBox.addItem("选项B");
		m_ComboBox.addItem("选项C");
		
		m_ComboBox.setSize(100,30);
		
		m_OutLable= new JLabel();
		m_OutLable.setLayout(null);
		m_OutLable.setBounds(0, 0, 120, 40);
		m_OutLable.add(m_ComboBox);
		m_ComboBox.setLocation(50, 50);
		
		//响应下拉列表的事件
		m_ComboBox.addItemListener(new ItemListener()
		{
			@Override
			public void itemStateChanged(ItemEvent e)
			{
				System.out.println("下拉列表的选中事件");
				if(e.getStateChange() == e.SELECTED)
				{
					//获取选择的值
					m_SelStr = (String)m_ComboBox.getSelectedItem();
					//结束选择
					fireEditingStopped();
				}
			}
		});
	}
	//检测鼠标的点击次数,判断编辑器是否起作用
	public boolean isCellEditable(EventObject anEvent) 
    {
		//如果事件 是 鼠标的事件,大于设定的次数就true,否则false
	    if (anEvent instanceof MouseEvent) 
	    {
			System.out.println("检测鼠标的点击次数,设置编辑器是否响应");
			return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
		}
	    return false;
    }
 
	//获取编辑器的组件
	@Override
	public Component getTableCellEditorComponent(JTable table, Object value,
			boolean isSelected, int row, int column)
	{
		System.out.println("获取编辑器的组件");
		//将下拉列表设置为之前的选项
		m_SelStr = (String)value;
		m_ComboBox.setSelectedItem(m_SelStr);
		//返回值为 null的时候 是空的编辑器,就是说 = =不允许 编辑的
		return m_OutLable;
	}
	//获取编辑器的 值
	@Override
	public Object getCellEditorValue()
	{return m_SelStr;}	
}