如何能得到JTable控件中的JCheckBox控件.

Taotesea 2016-04-14 04:11:10

我在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;
}
}
...全文
199 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Taotesea 2016-04-16
  • 打赏
  • 举报
回复
数组方法也不行的
Taotesea 2016-04-16
  • 打赏
  • 举报
回复
自己顶一下。。。。。。。。。。。。。。
Stluny 2016-04-15
  • 打赏
  • 举报
回复

	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 上就好了
Stluny 2016-04-15
  • 打赏
  • 举报
回复
TableCellRenderer就是用来绘制展示当前cell单元数值内容的,你可以用文字、数值或者图片来表示内容,当然最强大展示方式的就是通过自定义自己的renderer组件,通过Java2D来绘制各种天花乱坠的效果。 TableCellEditor主要是用来当用户点击在具体cell时进行编辑的组件,所以TableCellEditor除了具有TableCellRenderer一样的绘制功能外还可以进行交互动作,例如在cell上出现下拉框、勾选框甚至通过按钮弹出更复杂的对话框让用户进行输入编辑。 editotr 只能在可以输入文字的控件里有 不能输入的当然是没有editor的 其实我不知道你的需求是什么 如果你只是想改变单元格的内容表现形式 或者把单元格中的控件替换为别的控件你都可以通过renderre去做 继承DefaultTableCellRenderer 我不太明白你为什么用Editor。。 我平常editor还是很少用的 renderer功能就已经很强大了 renderer是和单元格相关的 你想放什么控件 return什么控件就行了 但是 要注意 renderer和editor都是一直在走的 基本上对表格的任何动作都会触发他们 所以尽量不要在getTableCellRendererComponent方法和 getTableCellEditorComponent方法中 new对象。。 这样会出现成好多的对象。。
Taotesea 2016-04-15
  • 打赏
  • 举报
回复
引用 6 楼 taotesea 的回复:
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.JavadocRemark_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(); } }
只能支持JTextField,JCheckBox,JComboBox,有时还想添加别的控件例如JLabel,DefaultCellEditor可以支持吗
Taotesea 2016-04-15
  • 打赏
  • 举报
回复
引用 4 楼 Stluny 的回复:
[quote=引用 3 楼 taotesea 的回复:] [quote=引用 2 楼 Stluny 的回复:] [quote=引用 1 楼 Stluny 的回复:] 你把这个cellEditor 怎么加进去的? 试着写个内部类 继承下DefaultCellEditor 你现在是实现的接口 你现在在这个方法getTableCellEditorComponent中有调了自己 被调的方法并没有实装。。 可能是这里的问题 如果不行试着用renderer做吧 继承DefaultTableCellRenderer 重写 getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) 别用接口
如果你给自己的table的celledit 加的就是你写的这个TableCellEditor_s 那么一定是实现接口的问题 [/quote] 我不想用DefaultTableCellRenderer,它只能支撑几个控件,所以我才用 TableCellEditor[/quote] 那你有没有试试 继承DefaultCellEditor ? 这不行么? 而且为什么Renderer只能支撑几个控件? 你给出的代码里没有做出什么特殊的处理啊。。 用renderer完全可以 。。 [/quote] 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; } } 谢谢:)
Taotesea 2016-04-15
  • 打赏
  • 举报
回复
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.JavadocRemark_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(); } }
Stluny 2016-04-15
  • 打赏
  • 举报
回复
引用 3 楼 taotesea 的回复:
[quote=引用 2 楼 Stluny 的回复:] [quote=引用 1 楼 Stluny 的回复:] 你把这个cellEditor 怎么加进去的? 试着写个内部类 继承下DefaultCellEditor 你现在是实现的接口 你现在在这个方法getTableCellEditorComponent中有调了自己 被调的方法并没有实装。。 可能是这里的问题 如果不行试着用renderer做吧 继承DefaultTableCellRenderer 重写 getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) 别用接口
如果你给自己的table的celledit 加的就是你写的这个TableCellEditor_s 那么一定是实现接口的问题 [/quote] 我不想用DefaultTableCellRenderer,它只能支撑几个控件,所以我才用 TableCellEditor[/quote] 那你有没有试试 继承DefaultCellEditor ? 这不行么? 而且为什么Renderer只能支撑几个控件? 你给出的代码里没有做出什么特殊的处理啊。。 用renderer完全可以 。。
Taotesea 2016-04-15
  • 打赏
  • 举报
回复
引用 12 楼 Stluny 的回复:
试着写了下 发现renderer行不通。。 尼玛啊 比我想的复杂啊。。 这个需要自己写Editor 然后把Editor放进去。。 Editor还需要自己加工下。。 把Table放进editor里去。。 容我鼓捣鼓捣。。
我还有一想法在,Celledit中加入一对应的数组,如果点击单元格,就调用对应的数组,不知是否可行。。。,谢谢你Stluny
Stluny 2016-04-15
  • 打赏
  • 举报
回复
试着写了下 发现renderer行不通。。 尼玛啊 比我想的复杂啊。。 这个需要自己写Editor 然后把Editor放进去。。 Editor还需要自己加工下。。 把Table放进editor里去。。 容我鼓捣鼓捣。。
Stluny 2016-04-15
  • 打赏
  • 举报
回复
上班 没法收代码啊。。 你的需求应该是不需要获得空间的吧。。 作做一个javaBean 俩字段 一个存是否被选中(默认都放0进去没被选中的状态) 一个存图片 把所有的数据存到全局的List中 set到tablemodel里 保证表示的顺序和List的顺序相同 在renderer或editor中的getcompont方法中获得第一列的Checkbox获得 1 表示选中 0表示未选中 在getcompont的方法里有参数 row就是行数 通过行数可以知道本行记录在list中对应那一条记录 修改那条记录的 表示是否被选中的字段 和当前勾选状态一致 返回checkbox控件 要删除的话 直接循环List 删除所有标记为被勾选状态的记录 然后table.repaint() 保存的话 一样循环 被选中的保存就好了 大体思路这样 我是试着搞个简单的demo给你吧。。。
Taotesea 2016-04-15
  • 打赏
  • 举报
回复
引用 8 楼 Stluny 的回复:
TableCellRenderer就是用来绘制展示当前cell单元数值内容的,你可以用文字、数值或者图片来表示内容,当然最强大展示方式的就是通过自定义自己的renderer组件,通过Java2D来绘制各种天花乱坠的效果。 TableCellEditor主要是用来当用户点击在具体cell时进行编辑的组件,所以TableCellEditor除了具有TableCellRenderer一样的绘制功能外还可以进行交互动作,例如在cell上出现下拉框、勾选框甚至通过按钮弹出更复杂的对话框让用户进行输入编辑。 editotr 只能在可以输入文字的控件里有 不能输入的当然是没有editor的 其实我不知道你的需求是什么 如果你只是想改变单元格的内容表现形式 或者把单元格中的控件替换为别的控件你都可以通过renderre去做 继承DefaultTableCellRenderer 我不太明白你为什么用Editor。。 我平常editor还是很少用的 renderer功能就已经很强大了 renderer是和单元格相关的 你想放什么控件 return什么控件就行了 但是 要注意 renderer和editor都是一直在走的 基本上对表格的任何动作都会触发他们 所以尽量不要在getTableCellRendererComponent方法和 getTableCellEditorComponent方法中 new对象。。 这样会出现成好多的对象。。
谢谢Stluny, 我的需求是这样的,在Jtable中有二列 第一列为JCheckBox主要的作用是判断是否选择上,第二列为JLabel是存放照片 首先将图片添加到第二列中,可以添加多张图片 并且在第一列中JCheckBox判断如果有选择上的,可以删除这一行,如果没有选择上的,就将 第二列提取JLabel这个控件,从中提取图片,提取出后写入数据库中 问题是我添加了这些控件,我需要从Jtable提取这些控件,而不是String类型的内容,可以我无法提取出对应单元里的控件 我理解TableCellRenderer是展示,TableCellEditor是鼠标点击有的相应单元格里内容,不知对不对 Stluny我可以将原码给发给你吗 谢谢:)
Taotesea 2016-04-14
  • 打赏
  • 举报
回复
引用 2 楼 Stluny 的回复:
[quote=引用 1 楼 Stluny 的回复:] 你把这个cellEditor 怎么加进去的? 试着写个内部类 继承下DefaultCellEditor 你现在是实现的接口 你现在在这个方法getTableCellEditorComponent中有调了自己 被调的方法并没有实装。。 可能是这里的问题 如果不行试着用renderer做吧 继承DefaultTableCellRenderer 重写 getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) 别用接口
如果你给自己的table的celledit 加的就是你写的这个TableCellEditor_s 那么一定是实现接口的问题 [/quote] 我不想用DefaultTableCellRenderer,它只能支撑几个控件,所以我才用 TableCellEditor
Stluny 2016-04-14
  • 打赏
  • 举报
回复
你把这个cellEditor 怎么加进去的? 试着写个内部类 继承下DefaultCellEditor 你现在是实现的接口 你现在在这个方法getTableCellEditorComponent中有调了自己 被调的方法并没有实装。。 可能是这里的问题 如果不行试着用renderer做吧 继承DefaultTableCellRenderer 重写 getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) 别用接口
Stluny 2016-04-14
  • 打赏
  • 举报
回复
引用 1 楼 Stluny 的回复:
你把这个cellEditor 怎么加进去的? 试着写个内部类 继承下DefaultCellEditor 你现在是实现的接口 你现在在这个方法getTableCellEditorComponent中有调了自己 被调的方法并没有实装。。 可能是这里的问题 如果不行试着用renderer做吧 继承DefaultTableCellRenderer 重写 getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) 别用接口
如果你给自己的table的celledit 加的就是你写的这个TableCellEditor_s 那么一定是实现接口的问题

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧