我在Jtable中添加了JCheckBox控件,但是希望在添加控件时,首先判断在单元格中是否有控件,如果有只是用原先的控件,如果没有就新增,所在getTableCellEditorComponent,加了一个判断,但是报错.
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
原码如下:public class TableCellEditor_s extends JPanel implements TableCellEditor, ActionListener {
@Override
public Component getTableCellEditorComponent(JTable table, Object objValue, boolean isSelected, int iRow, int iColumn) {
if (table.getCellEditor()!=null){
TableCellEditor cellEditor=table.getCellEditor(0,1);
Component component=cellEditor.getTableCellEditorComponent(table, objValue, isSelected, 0 , 1);
//这里报错,Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
return (JCheckBox)component
}else{
if (iColumn == 1) {
JCheckBox checkBox = new JCheckBox();
checkBox.setText("a");
return checkBox;
}
}
return null;
}
}

解决方案 »

  1.   

    你把这个cellEditor 怎么加进去的?
    试着写个内部类 继承下DefaultCellEditor  
    你现在是实现的接口  你现在在这个方法getTableCellEditorComponent中有调了自己  被调的方法并没有实装。。  可能是这里的问题如果不行试着用renderer做吧  继承DefaultTableCellRenderer  重写 getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column)   别用接口
      

  2.   

    如果你给自己的table的celledit 加的就是你写的这个TableCellEditor_s  那么一定是实现接口的问题  
      

  3.   

    如果你给自己的table的celledit 加的就是你写的这个TableCellEditor_s  那么一定是实现接口的问题  
    我不想用DefaultTableCellRenderer,它只能支撑几个控件,所以我才用 TableCellEditor
      

  4.   

    如果你给自己的table的celledit 加的就是你写的这个TableCellEditor_s  那么一定是实现接口的问题  
    我不想用DefaultTableCellRenderer,它只能支撑几个控件,所以我才用 TableCellEditor那你有没有试试 继承DefaultCellEditor ?   这不行么?  而且为什么Renderer只能支撑几个控件?     你给出的代码里没有做出什么特殊的处理啊。。    用renderer完全可以 。。 
      

  5.   

    如果你给自己的table的celledit 加的就是你写的这个TableCellEditor_s  那么一定是实现接口的问题  
    我不想用DefaultTableCellRenderer,它只能支撑几个控件,所以我才用 TableCellEditor那你有没有试试 继承DefaultCellEditor ?   这不行么?  而且为什么Renderer只能支撑几个控件?     你给出的代码里没有做出什么特殊的处理啊。。    用renderer完全可以 。。 package T;import java.awt.Component;
    import java.awt.LayoutManager;import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.table.TableCellRenderer;
    public class __TableCellRenderer_s extends JPanel implements TableCellRenderer {
    private JCheckBox m_CheckBox = new JCheckBox(); private void _initializtionProperty() {
    }
    public __TableCellRenderer_s() {
    _initializtionProperty();
    }

    public __TableCellRenderer_s(LayoutManager layout) {
    super(layout);
    _initializtionProperty();
    }

    public __TableCellRenderer_s(boolean isDoubleBuffered) {
    super(isDoubleBuffered);
    _initializtionProperty();
    }

    public __TableCellRenderer_s(LayoutManager layout, boolean isDoubleBuffered) {
    super(layout, isDoubleBuffered);
    _initializtionProperty();
    }

    public Component getTableCellRendererComponent(JTable table, Object objValue, boolean isSelected, boolean hasFocus, int iRow, int iColumn) {
    if (iColumn == 1) {
    m_CheckBox._setText("d");
    return m_CheckBox;
    }
    return null;
    }
    }
    谢谢:)
      

  6.   

    package _Test;import javax.swing.DefaultCellEditor;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JTextField;/**
     * <pre>
     * {@link H.JavadocDescription_s}:
     *    
     *  
     *  
     * {@link H.JavadocCode_s}:
     *  
     *   
     *  
     * {@link H.JavadocRe_s}:
     * 
     * 
     * 
     * </pre>
    *@see H.JavadocMain________________________________________________________________________________________________s
     */
    public class test extends DefaultCellEditor {
    /** private variable. */

    /**
     * <pre>
     * {@link H.JavadocFunctionName_s}:_InitializtionProperty.
     * {@link H.JavadocDescription_s}:
     * {@link H.JavadocCode_s}:
     *
     * @return void
     * </pre>
     *@see H.JavadocMain________________________________________________________________________________________________s
     */
    private void _initializtionProperty() {

    }

    public test(JTextField textField) {
    super(textField);
    _initializtionProperty();
    }

    public test(JCheckBox checkBox) {
    super(checkBox);
    _initializtionProperty();
    }

    public test(JComboBox comboBox) {
    super(comboBox);
    _initializtionProperty();
    }
    }
      

  7.   

    只能支持JTextField,JCheckBox,JComboBox,有时还想添加别的控件例如JLabel,DefaultCellEditor可以支持吗
      

  8.   

    TableCellRenderer就是用来绘制展示当前cell单元数值内容的,你可以用文字、数值或者图片来表示内容,当然最强大展示方式的就是通过自定义自己的renderer组件,通过Java2D来绘制各种天花乱坠的效果。TableCellEditor主要是用来当用户点击在具体cell时进行编辑的组件,所以TableCellEditor除了具有TableCellRenderer一样的绘制功能外还可以进行交互动作,例如在cell上出现下拉框、勾选框甚至通过按钮弹出更复杂的对话框让用户进行输入编辑。editotr 只能在可以输入文字的控件里有 不能输入的当然是没有editor的  
    其实我不知道你的需求是什么  如果你只是想改变单元格的内容表现形式  或者把单元格中的控件替换为别的控件你都可以通过renderre去做 继承DefaultTableCellRenderer  我不太明白你为什么用Editor。。   我平常editor还是很少用的  renderer功能就已经很强大了  renderer是和单元格相关的  你想放什么控件 return什么控件就行了  但是 要注意 renderer和editor都是一直在走的 基本上对表格的任何动作都会触发他们  所以尽量不要在getTableCellRendererComponent方法和  getTableCellEditorComponent方法中 new对象。。  这样会出现成好多的对象。。  
      

  9.   


    private class TableCellEditor extends DefaultCellEditor{ public TableCellEditor(JCheckBox checkBox) {
    super(checkBox);
    }

    @Override
    public Component getTableCellEditorComponent(JTable table,
    Object value, boolean isSelected, int row, int column) {
    JComponent comp = (JComponent) super.getTableCellEditorComponent(table, value, isSelected, row, column);
    if(comp instanceof JCheckBox){
    return comp;
    }else{
    if (column== 1) {
    JCheckBox checkBox = new JCheckBox();
    checkBox.setText("a");
    return checkBox;
    }
    }
    }
    }
    如果要用editor  在第一列替换为checkbox  这样写应该是可以得  再把这个editor加到table 上就好了
      

  10.   

    谢谢Stluny,
    我的需求是这样的,在Jtable中有二列
    第一列为JCheckBox主要的作用是判断是否选择上,第二列为JLabel是存放照片
    首先将图片添加到第二列中,可以添加多张图片
    并且在第一列中JCheckBox判断如果有选择上的,可以删除这一行,如果没有选择上的,就将
    第二列提取JLabel这个控件,从中提取图片,提取出后写入数据库中
    问题是我添加了这些控件,我需要从Jtable提取这些控件,而不是String类型的内容,可以我无法提取出对应单元里的控件
    我理解TableCellRenderer是展示,TableCellEditor是鼠标点击有的相应单元格里内容,不知对不对Stluny我可以将原码给发给你吗
    谢谢:)
      

  11.   

    上班 没法收代码啊。。   你的需求应该是不需要获得空间的吧。。  作做一个javaBean  俩字段 一个存是否被选中(默认都放0进去没被选中的状态)  一个存图片  
    把所有的数据存到全局的List中   set到tablemodel里  保证表示的顺序和List的顺序相同 在renderer或editor中的getcompont方法中获得第一列的Checkbox获得  1 表示选中 0表示未选中  在getcompont的方法里有参数 row就是行数  通过行数可以知道本行记录在list中对应那一条记录  修改那条记录的 表示是否被选中的字段 和当前勾选状态一致  返回checkbox控件  要删除的话 直接循环List 删除所有标记为被勾选状态的记录  然后table.repaint()   保存的话 一样循环 被选中的保存就好了  大体思路这样  我是试着搞个简单的demo给你吧  
      

  12.   

    试着写了下  发现renderer行不通。。   尼玛啊  比我想的复杂啊。。  这个需要自己写Editor 然后把Editor放进去。。  Editor还需要自己加工下。。 把Table放进editor里去。。  容我鼓捣鼓捣。。   
      

  13.   

    我还有一想法在,Celledit中加入一对应的数组,如果点击单元格,就调用对应的数组,不知是否可行,谢谢你Stluny