为了实现表格的多行和多列,我用tablecellrenderer把一个jTable的单元格(cell)改成加在JScrollPane里的cellTable,然后用了celleditor来实现对cellTable的访问。
但是遇到的问题是--在点击这个cellTable后,再点击jTable的其他单元,这个cellTable就消失了!而且出现下列的异常:Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding container's parent to itself
at java.awt.Container.addImpl(Container.java:1005)
at java.awt.Container.add(Container.java:351)
at javax.swing.JTable.editCellAt(JTable.java:2643)
at javax.swing.plaf.basic.BasicTableUI$Handler.adjustFocusAndSelection(BasicTableUI.java:922)
at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(BasicTableUI.java:889)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:222)
at java.awt.Component.processMouseEvent(Component.java:5485)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3889)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1774)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)下面是我写的RENDERER和EDITOR://这个是重写的RENDERER,经测试没有问题import java.awt.Component;
import java.awt.Font;import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;public class JTableHeadCellRenderer extends JScrollPane implements TableCellRenderer {   private Font tableFont = new Font("SansSerif", Font.PLAIN, 14);
  public JTableHeadCellRenderer() {
  setOpaque(true);
  setForeground(UIManager.getColor("TableHeader.foreground"));
  setBackground(UIManager.getColor("TableHeader.background"));
  setBorder(javax.swing.BorderFactory.createEmptyBorder(0,0,0,0));
  }   public Component getTableCellRendererComponent(JTable table, Object value,
                   boolean isSelected, boolean hasFocus, int row, int column) {
    if (isSelected) {
      setForeground(table.getSelectionForeground());
      setBackground(table.getSelectionBackground());
    } else{
      setForeground(table.getForeground());
      setBackground(table.getBackground());
    }
    
    if (value != null){
     JTable t = (JTable)value;
     t.setForeground(UIManager.getColor("TableHeader.foreground"));
t.setBackground(UIManager.getColor("TableHeader.background"));
t.setBorder(javax.swing.BorderFactory.createEmptyBorder(0,0,0,0));
t.setEnabled(false);
//t.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
t.setFont(tableFont);
     setViewportView(t);
    }
    return this;
  }
}//下面是重写的EDITOR
import java.awt.Component;import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JTable;public class JScrollPaneEditor extends DefaultCellEditor { private JTable table;

public JScrollPaneEditor(JCheckBox checkBox) {
super(checkBox);
} public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
if (value != null){
table = (JTable) value;
}
return table;
} public Object getCellEditorValue() {
return table;
  }
}经过分步测试,问题完全出在重写的CELLEDITOR上,但却找不到解决的办法,急请大家赐教!

解决方案 »

  1.   

    忘了说了,这个RENDERER和EDITOR是通过对jTable的列(column)起作用的.具体如下:DefaultTableModel dm = new DefaultTableModel();     
    dm.setDataVector(new Object[][]{{getNameTable(),"",""}}, new Object[]{"name","Adress", "Company"});
    JTable jTable = new JTable(dm); 
    jTable.setRowHeight(200);
    jTable.setShowGrid(false);
    jTable.getColumn("name").setCellRenderer(new JTableHeadCellRenderer());
    jTable.getColumn("name").setCellEditor(new JScrollPaneEditor(new JCheckBox()));getNameTable()得到的是一个12X3的表格,在这里它被加载到jTable第一列第一行的单元格.我知道问题出在JScrollPaneEditor的public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)方法的重写上,但就是不知道该怎么改.
     
    还请大家帮忙看看
      

  2.   

    public Component getTableCellEditorComponent(JTable table, Object value,
    boolean isSelected, int row, int column) {
    if (value != null){
    if (isSelected)
    this.table = (JTable) value;
    }
    return this.table;
    }
    问题解决了!:D
    是自己犯浑,居然忘了这个方法里有重名的参数,导致每次加载的都是自己本身,所以出错.看来还是要好好学啊.
    多谢顶贴的两位朋友.
    再看看,如果这个程序没问题了我就散分^^
      

  3.   

    >>Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding container's parent to itself
    出了异常首先看异常信息,是很有用的。