//创建表的代码,这是在一个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; // 目标是:实时刷新表格中显示
}
}
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;
}
}
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; // 目标是:实时刷新表格中显示
}
}