我在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;
}
}
试着写个内部类 继承下DefaultCellEditor
你现在是实现的接口 你现在在这个方法getTableCellEditorComponent中有调了自己 被调的方法并没有实装。。 可能是这里的问题如果不行试着用renderer做吧 继承DefaultTableCellRenderer 重写 getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) 别用接口
我不想用DefaultTableCellRenderer,它只能支撑几个控件,所以我才用 TableCellEditor
我不想用DefaultTableCellRenderer,它只能支撑几个控件,所以我才用 TableCellEditor那你有没有试试 继承DefaultCellEditor ? 这不行么? 而且为什么Renderer只能支撑几个控件? 你给出的代码里没有做出什么特殊的处理啊。。 用renderer完全可以 。。
我不想用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;
}
}
谢谢:)
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();
}
}
其实我不知道你的需求是什么 如果你只是想改变单元格的内容表现形式 或者把单元格中的控件替换为别的控件你都可以通过renderre去做 继承DefaultTableCellRenderer 我不太明白你为什么用Editor。。 我平常editor还是很少用的 renderer功能就已经很强大了 renderer是和单元格相关的 你想放什么控件 return什么控件就行了 但是 要注意 renderer和editor都是一直在走的 基本上对表格的任何动作都会触发他们 所以尽量不要在getTableCellRendererComponent方法和 getTableCellEditorComponent方法中 new对象。。 这样会出现成好多的对象。。
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 上就好了
我的需求是这样的,在Jtable中有二列
第一列为JCheckBox主要的作用是判断是否选择上,第二列为JLabel是存放照片
首先将图片添加到第二列中,可以添加多张图片
并且在第一列中JCheckBox判断如果有选择上的,可以删除这一行,如果没有选择上的,就将
第二列提取JLabel这个控件,从中提取图片,提取出后写入数据库中
问题是我添加了这些控件,我需要从Jtable提取这些控件,而不是String类型的内容,可以我无法提取出对应单元里的控件
我理解TableCellRenderer是展示,TableCellEditor是鼠标点击有的相应单元格里内容,不知对不对Stluny我可以将原码给发给你吗
谢谢:)
把所有的数据存到全局的List中 set到tablemodel里 保证表示的顺序和List的顺序相同 在renderer或editor中的getcompont方法中获得第一列的Checkbox获得 1 表示选中 0表示未选中 在getcompont的方法里有参数 row就是行数 通过行数可以知道本行记录在list中对应那一条记录 修改那条记录的 表示是否被选中的字段 和当前勾选状态一致 返回checkbox控件 要删除的话 直接循环List 删除所有标记为被勾选状态的记录 然后table.repaint() 保存的话 一样循环 被选中的保存就好了 大体思路这样 我是试着搞个简单的demo给你吧