//创建表的代码,这是在一个JPanel容器中的代码片段,底层的value二维数组全部是ImageIconDataTableModel tableModel = new DataTableModel(value, columnName, columnType);
table = new JTable(tableModel);
TableColumnModel tcm = table.getColumnModel();
//只取得第一列进行测试
TableColumn t2 = tcm.getColumn(1);
//t2.setCellRenderer(new Render()); //取消注释后,错的一塌糊涂
t2.setCellEditor(new Editor());我的测试目标就是,希望在每个单元格中,显示一个构件JPanel,它有两个子构件,一个JLabel用来装value[i][j]这个ImageIcon对象;还有一个JButton,来实现点击之后修改JLabel中装的图片为从外界选择的图片。
应该是,我的Render与Editor没写好,请各位帮忙看看!//下面是Render类与Editor的实现
class Render implements TableCellRenderer {
private JPanel pane;
private JButton modify;
private JLabel holder;
public Render() {
pane = new JPanel(new BorderLayout());
modify = new JButton("修改");
pane.add(modify, BorderLayout.SOUTH);
}
public Component getTableCellRendererComponent(JTable table, Object val, boolean isSelected, boolean hasFocus, int row, int column) {
System.out.println(val);
if(val == null) {
System.out.println("null error");
System.exit(0);
}
holder.setIcon((ImageIcon)val);
 /* 把 //t2.setCellRenderer(new Render());取消掉注释之后,这一行就会报错,说是
Exception in thread"AWT-EventQueue-0" java.lang.NullPointerException
at Render.getTableCellRendererComponent(TestFirst.java:101)*、
return pane; // 目标是:实时刷新表格中显示
}
}
class Editor extends AbstractCellEditor implements TableCellEditor{
private JPanel pane;
private JButton modify;
private JLabel holder;
private String name;
private JFileChooser chooser = new JFileChooser(".");
public Editor() {
    FileNameExtensionFilter filter = new FileNameExtensionFilter(
            "JPG & GIF Images", "jpg", "gif");
    chooser.setFileFilter(filter);
pane = new JPanel(new BorderLayout());
modify = new JButton("修改");
modify.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
        int returnVal = chooser.showOpenDialog(null);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
         File fTmp = chooser.getSelectedFile();
         System.out.println("打开 " + fTmp.getName());
         name = fTmp.getName();
        }
}
});
pane.add(modify, BorderLayout.SOUTH);
}
public Object getCellEditorValue() {
return new ImageIcon(name);
}
public Component getTableCellEditorComponent(JTable table, Object val, boolean isSelected, int row, int column) {
System.out.println(val); // 打印一下
if(val instanceof ImageIcon) {
holder = new JLabel((ImageIcon)val);
pane.add(holder);
}
pane.add(holder);
return pane; // 目标是:实时刷新表格中显示
}
}

解决方案 »

  1.   

    表模型class DataTableModel extends AbstractTableModel {
    private Object[][] value;
    private String[] columnName;
    private int[] columnType;
    public DataTableModel(Object[][] x_val, String[] x_name, int[] x_type) {
    value =x_val;
    columnName = x_name;
    columnType = x_type;
    }
    public int getColumnCount() {
    return value[0].length;
    }
    public int getRowCount() {
    return value.length;
    }
    public Object getValueAt(int i, int j) {
    return value[i][j];
    }
    public String getColumnName(int i) {
    return columnName[i]; 
    }
    public boolean isCellEditable(int i, int j) {
    return true;
    }
    public void setValueAt(Object aval, int i, int j) {
    value[i][j] = aval;
    }
    public Object[][] getBaseValue() {
    return value;
    }
    }
      

  2.   

    上面Render与Editor没贴好,重新贴下,拜托各位,费心看下//下面是Render类与Editor的实现
    class Render implements TableCellRenderer {
    private JPanel pane;
    private JButton modify;
    private JLabel holder;
    public Render() {
    pane = new JPanel(new BorderLayout());
    modify = new JButton("修改");
    pane.add(modify, BorderLayout.SOUTH);
    }
    public Component getTableCellRendererComponent(JTable table, Object val, boolean isSelected, boolean hasFocus, int row, int column) {
    System.out.println(val);
    if(val == null) {
    System.out.println("null error");
    System.exit(0);
    }
    holder.setIcon((ImageIcon)val);
     /* 把 //t2.setCellRenderer(new Render());取消掉注释之后,这一行就会报错,说是
    Exception in thread"AWT-EventQueue-0" java.lang.NullPointerException
    at Render.getTableCellRendererComponent(TestFirst.java:101)*/
    return pane; // 目标是:实时刷新表格中显示
    }
    }
    class Editor extends AbstractCellEditor implements TableCellEditor{
    private JPanel pane;
    private JButton modify;
    private JLabel holder;
    private String name;
    private JFileChooser chooser = new JFileChooser(".");
    public Editor() {
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
                "JPG & GIF Images", "jpg", "gif");
        chooser.setFileFilter(filter);
    pane = new JPanel(new BorderLayout());
    modify = new JButton("修改");
    modify.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
            int returnVal = chooser.showOpenDialog(null);
            if(returnVal == JFileChooser.APPROVE_OPTION) {
             File fTmp = chooser.getSelectedFile();
             System.out.println("打开 " + fTmp.getName());
             name = fTmp.getName();
            }
    }
    });
    pane.add(modify, BorderLayout.SOUTH);
    }
    public Object getCellEditorValue() {
    return new ImageIcon(name);
    }
    public Component getTableCellEditorComponent(JTable table, Object val, boolean isSelected, int row, int column) {
    System.out.println(val); // 打印一下
    if(val instanceof ImageIcon) {
    holder = new JLabel((ImageIcon)val);
    pane.add(holder);
    }
    pane.add(holder);
    return pane; // 目标是:实时刷新表格中显示
    }
    }