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