class
MyTableModel
extends
AbstractTableModel
{
//表格的列标题 String head[]={"下拉列表","图片"}; //表格列属性,用于设置列的维护数据类型 Class[]TypeArr = {String.class,Icon.class}; //表格的数据 Object[][]data = { {"选项A",new ImageIcon("C://I//pic1.png")}, {"选项B",new ImageIcon("C://I//pic2.png")} };
//表格的行数 @Override
public
int
getRowCount()
{
return
2
;}
//表格的列数
@Override
public
int
getColumnCount()
{
return
2
;}
//获取数据
@Override
public
Object getValueAt(
int
rowIndex,
int
columnIndex)
{
return
data[rowIndex][columnIndex];}
//获取表格每一列需要维护的数据类型
@Override
public
Class getColumnClass(
int
columnIndex)
{
return
TypeArr[columnIndex]; }
//设置每个表格允许编辑
@Override
public
boolean
isCellEditable(
int
rowIndex,
int
columnIndex)
{
return
true
;}
//表格的列标题
@Override
public
String getColumnName(
int
column)
{
return
head[column];}
//修改数据
@Override
public
void
setValueAt(Object aValue,
int
rowIndex,
int
columnIndex)
{
//修改Vector的数据
data[rowIndex][columnIndex] = aValue;
//只需要更新对应的位置就行
this
.fireTableCellUpdated(rowIndex, columnIndex);
}
}
// //
//************************************************************************自定义的图片编辑器
//实现 TableCellEditor,ActionListener 接口
class
MyPicEditor
extends
AbstractCellEditor
implements
TableCellEditor,ActionListener
{
/*
*ReadMe:当我们点击表格Cell的时候,表格检测点击的消息,检测Cell是否允许编辑,
*如果允许编辑 则去调用 表格编辑器 来获取图片,获取完后将图片 送达给 TableModel
*结束编辑器的编辑状态,表格刷新显示 对应的图片
*/
//用于获取图片的变量
private Icon m_IconPic;
//作为 编辑器 ,当我们点击的时候进行图片的选择
private JButton m_IconButton;
//点击按钮的时候 进行文件选择的 Filechooser
private JFileChooser m_PicFileChooser;
//设置当我们 点击2次的时候 编辑器 才起作用
private static final int clickCountToStart = 2;
//构造函数,初始化一些信息
public MyPicEditor()
{
m_IconButton =new JButton();
m_IconButton.addActionListener(this);
m_PicFileChooser = new JFileChooser();
}
//检测鼠标的点击次数,判断编辑器是否起作用
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("表格Cell获取将要显示的编辑器组件,返回值编辑器包含的控件");
//先前的表格Cell的 数据 先保存下来,用于初始化编辑器包含的控件的数据
m_IconPic = (Icon)value;
//返回作为编辑器的组件,这里是一个按钮
return m_IconButton;
}
//响应编辑器包含的组件的事件
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println("编辑器组件事件响应");
if(e.getSource()==m_IconButton)
{
//初始化编辑器,显示原始的图片
m_IconButton.setIcon(m_IconPic);
//显示文件选择器,用于选择图片
m_PicFileChooser.showOpenDialog(m_IconButton);
if(m_PicFileChooser.getSelectedFile()!=null)
{
//如果选择了新的图片将按钮设置为新的图标
m_IconPic= new ImageIcon(m_PicFileChooser.getSelectedFile().getAbsolutePath());
}
//数据获取完成,终止编辑器,将数据送达 调用者
this.fireEditingStopped();
}
}
//将数据送达调用者,关闭编辑器,表格正常显示
@Override
public Object getCellEditorValue()
{
System.out.println("返回结果");
return m_IconPic;
}
}
// //下拉列表的编辑器
//****************************************************************Commbox的编辑器
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()
{
System.out.println(
"返回结果"
);
return
m_SelStr;
}
}
// // // TabelMode、编辑器都有了,我们只需要 一个JTable 显示一下就Ok了 //****************************************************定义显示表格的Frame
public
class
CellEditorFrame
{
public
static
void
main(String[]sre)
{
MyTableModel m_TableModel =
new
MyTableModel();
JTable m_TableDemo =
new
JTable(m_TableModel);
//定义两个编辑器
ComBoxEditor m_ComboBoxEditor =
new
ComBoxEditor();
MyPicEditor m_PicEditor =
new
MyPicEditor();
JFrame m_MyFrame =
new
JFrame(
"我的CellEditor"
);
//为每一列 设置编辑器
m_TableDemo.getColumnModel().getColumn(
0
).setCellEditor(m_ComboBoxEditor);
m_TableDemo.getColumnModel().getColumn(
1
).setCellEditor(m_PicEditor);
//设置行高
m_TableDemo.setRowHeight(
200
);
JScrollPane m_JScroolPanel =
new
JScrollPane(m_TableDemo);
m_JScroolPanel.setViewportView(m_TableDemo);
m_JScroolPanel.setSize(
480
,
200
);
m_MyFrame.add(m_JScroolPanel);
m_MyFrame.setBounds(
200
,
200
,
500
,
500
);
m_MyFrame.setDefaultCloseOperation(m_MyFrame.EXIT_ON_CLOSE);
m_MyFrame.setVisible(
true
);
}
}
|