| 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); } } |