JTable中JComboBox的默认值问题

dreampeter 2007-11-12 12:40:32
现有如下几个组件,JTable,JComboBox
在JTable中加入了一列JComboBox,

table.getColumnModel().getColumn(5).setCellEditor(new DefaultCellEditor(new DP_ComboBox(items,"0")));

加载数据后

model.addRow(new Object[] {"A0001", "AUName", "AUUserID", "AUPasswd", "AUType", new DP_ComboBox(items,"0"), "AUDF", "AURegion"});

其他组件说明:
model为一个AbstractTableModel类;
DP_ComboBox为一个自定义的JComboBox,其中实现了类似WEB中<select>的效果,即有一个text属性和一个value属性,显示的为text,运用过程中取实际的value值

但现在发现如下的一个问题:
向JTable中加载数据后JComboBox中显示的数据正确,但是如果选取一个非最后行的JComboBox时,发现默认值变成了在设置cellEditor时的值了,而不是默认从数据库中读出的值。
用此例来说,在设置cellEditor时,设置的是new DP_ComboBox(items,"0"),即JComboBox的默认值为0,显示为“否”,但如果经过如下加载数据后

model.addRow(new Object[] {"A0001", "AUName", "AUUserID", "AUPasswd", "AUType", new DP_ComboBox(items,"1"), "AUDF", "AURegion"});
model.addRow(new Object[] {"A0001", "AUName", "AUUserID", "AUPasswd", "AUType", new DP_ComboBox(items,"0"), "AUDF", "AURegion"});

这样在JTable中就有了两行数据,但由于第二行设置数据的JComboBox默认值为0和setCellEditor一致,所以看不出区别,但点了第一行之后默认值却由原来的1变成了0,即根据数据库加载的数据第一行JComboBox的默认值为1,但由于setCellEditor设置时的值为0,点了这个JComboBox后即便是不选择任何一项,显示的默认值都会变成0。

不知道有没有朋友遇到过这样的现象或者是有解决的方法,说的有点乱,不知道大家看明白了没有。问题比较急,希望能尽快解决,在此先谢谢各位啦。
...全文
1786 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
exile_dream 2011-07-20
  • 打赏
  • 举报
回复
swing麻烦 不好用啊。。
胡矣 2007-11-21
  • 打赏
  • 举报
回复
MARK
dreampeter 2007-11-21
  • 打赏
  • 举报
回复
问题还是没有解决啊
sdd330 2007-11-14
  • 打赏
  • 举报
回复
这个是CellEditor的问题吧,在编辑状态下的,Render就不需要重写了
dreampeter 2007-11-13
  • 打赏
  • 举报
回复
to sdd330

大概的我也了解一点
那如何在向JTable或TableModel中添加数据的时候就把新的实例加到指定的Cell里呢?
现在关键的问题就在如何加新实例到表中,还有一个就是如何取出表中的实例
fytain 2007-11-13
  • 打赏
  • 举报
回复
重新排了一下:

你这个的Renderer和Editor都需要重写

重写DefaultCellEditor:
public Component getTableCellEditorComponent(JTable table, Object value,boolean isSelected,
int row, int column) {
Component c = super.getTableCellEditorComponent(table,value,isSelected,row,column);
if (c instanceof DP_ComboBox) {
//TODO:根据参数值value设置DP_ComboBox的值
}
return c;
}

实现自己的TableCellRenderer:
class DP_ComboBoxRenderer implements DefaultTableCellRenderer {
private DP_ComboBox dp;
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
//TODO:根据value值设置dp的值
return dp;
}
}

然后把Editor和 Renderer设给5列

你这个程序还需要解决value是什么形式的问题,没有必要非把DP_ComboBox传给table,只需要把它需要的值传过来就行了.
就像在显示其它列数据的时候是一个JLabel, table相应的列只需要String型的数据就可以了,不用每一个Cell都传一个JLabel给它.
不用这样:
model.addRow(newObject[]{"A0001","AUName", "AUUserID","AUPasswd", "AUType", new DP_ComboBox(items,"0"), "AUDF", "AURegion"});
可以这样:
model.addRow(new Object[] {"A0001", "AUName", "AUUserID","AUPasswd","AUType", newDPData(items,"0"),"AUDF","AURegion"});
DPData是DP_ComboBox存的数据

不知道我写的能不能让楼主觉得清楚.建议你看一下JTable的Render和Editor机制.
ps: 也不知道写全了没,你测试一下吧.
fytain 2007-11-13
  • 打赏
  • 举报
回复
你这个的Renderer和Editor都需要重写

重写DefaultCellEditor:
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row, int column) {
Component c = super.getTableCellEditorComponent();
if (c instanceof DP_ComboBox) {
// 根据参数值value设置DP_ComboBox的值
}
return c;
}

实现自己的TableCellRenderer:
class DP_ComboBoxRenderer implements DefaultTableCellRenderer {
private DP_ComboBox dp;
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
//TODO: 根据value值设置dp的值
return dp;
}
}

然后把Editor和 Render设给5列

你这个程序还需要解决value是什么形式的问题, 没有必要非把DP_ComboBox传给table,只需要把它需要的值传过来就行了.
就像在显示其它列数据的时候是一个JLabel, table相应的列只需要String型的数据就可以了,不用每一个Cell都传一个 JLabel给它.
不用这样:
model.addRow(new Object[] { "A0001 ", "AUName ", "AUUserID ", "AUPasswd ", "AUType ", new DP_ComboBox(items, "0 "), "AUDF ", "AURegion "});
可以这样:
model.addRow(new Object[] { "A0001 ", "AUName ", "AUUserID ", "AUPasswd ", "AUType ", new DPData(items, "0 "), "AUDF ", "AURegion "});
DPData是DP_ComboBox存的数据

不知道我写的能不能让楼主觉得清楚.建议你看一下JTable的Render和Editor机制.
suxujie 2007-11-13
  • 打赏
  • 举报
回复
up
sdd330 2007-11-13
  • 打赏
  • 举报
回复
public TableCellEditor getCellEditor(int i, int j){
if(model.getValueAt(i, j) instanceof DP_ComboBox){
return new DefaultCellEditor((DP_ComboBox)model.getValueAt(i, j));
}
}
wesnow 2007-11-12
  • 打赏
  • 举报
回复
学习,我还没在JTable中加过JComboBox,连自定义JComboBox都没搞过。java的swing麻烦,不好用。
karlpan01 2007-11-12
  • 打赏
  • 举报
回复
先帮你顶啊
sdd330 2007-11-12
  • 打赏
  • 举报
回复
table.getColumnModel().getColumn(5).setCellEditor(new DefaultCellEditor(new DP_ComboBox(items, "0 ")));
这样设置的话CellEditor实例只有一个。
重载JTable的public TableCellEditor getCellEditor(int i, int j){
//跟据实际情况动态地返回CellEditor
String _sDefault = _aDefaultValue[i][j] ;
return new DefaultCellEditor(new DP_ComboBox(items, _sDefault));


dreampeter 2007-11-12
  • 打赏
  • 举报
回复
再顶一顶啊,找不到解决方法不甘心啊
Java开发技术大全 电子版 第1篇Java基础知识入门. 第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释执行命令的使用10 1.2.5UltraEdit的使用11 1.3一个简单的Java应用程序14 1.4一个简单的Java小程序16 1.5本章小结18 第2章Java语言基础19 2.1Java语言的特点19 2.2Java程序的构成21 2.3数据类 型23 2.3.1基本数据类型23 2.3.2常量25 2.3.3变量26 2.3.4整型数据27 .2.3.5浮点型数据29 2.3.6字符型数据30 2.3.7布尔型数据32 2.3.8变量赋初值33 2.3.9变量的作用域34 2.3.10数据类型转换34 2.4运算符与表达式37 2.4.1算术运算符和算术表达式38 2.4.2关系运算符和关系表达式43 2.4.3逻辑运算符和逻辑表达式44 2.4.4条件运算符和条件表达式48 2.4.5位运算符和位运算表达式50 2.4.6赋值运算符和赋值表达式53 2.4.7表达式的求值顺序55 2.5流程控制语句58 2.5.1三种基本控制结构58 2.5.2表达式语句和空语句59 2.5.3块语句60 2.5.4if~else分支语句61 2.5.5多路分支switch~case语句69 2.5.6当型循环while语句71 2.5.7直到型循环do~while语句72 2.5.8当型循环for语句74 2.5.9循环的嵌套78 2.5.10跳转语句break80 2.5.11跳转语句continue82 2.6程序文本的风格84 2.6.1注释84 2.6.2程序的格式编排87 2.7基础语法实战演习88 2.7.1判断闰年88 2.7.2求最大公约数和最小公倍数89 2.7.3Fibonacci数列90 2.7.4逆向输出数字91 2.7.5求水仙花数92 2.7.6输出图形93 2.7.7输出九九口诀表94 2.8本章小结95 第2篇Java面向对象编程 第3章对象和类98 3.1面向对象的基本概念98 3.1.1对象98 3.1.2类99 3.1.3消息101 3.1.4面向对象的4个基本特征101 3.2类与对象104 3.2.1类的基本结构104 3.2.2类的声明104 3.2.3创建类体105 3.2.4对象的生命周期106 3.2.5对象的创建106 3.2.6对象的使用108 3.2.7对象的释放和垃圾收集机制108 3.3成员变量的定义与使用109 3.3.1成员变量的定义109 3.3.2成员变量的访问权限110 3.3.3实例成员变量和静态成员变量114 3.4方法的定义和实现116 3.4.1方法的声明117 3.4.2创建方法体与return语句117 3.4.3局部变量和成员变量的区别119 3.4.4方法的访问权限121 3.5方法的调用121 3.5.1方法调用的形式121 3.5.2方法调用的参数123 3.5.3隐含参数this127 3.6构造方法128 3.6.1无参数构造方法的定义和使用129 3.6.2带参数构造方法的定义和使用131 3.6.3this关键字和构造方法的调用132 3.7静态方法133 3.7.1静态方法的声明和定义134 3.7.2静态方法和实例方法的区别134 3.7.3静态代码块136 3.7.4再论静态成员变量137 3.8main()方法和命令行参数139 3.9结束方法141 3.10本地方法141 3.11本章小结144 第4章继承与多态145 4.1继承的基本原理145 4.2子类对父类的继承146 4.3属性隐藏和方法的覆盖148 4.3.1属性的隐藏148 4.3.2方法的覆盖151 4.4构造方法的继承154 4.5super的使用156 4.5.1用super引用父类的成员156 4.5.2使用super调用父类的构造方法157 4.6继承的内部处理158 4.7多态的基本概念159 4.8重载159 4.8.1普通方法的重载160 4.8.2构造方法的重载161 4.8.3重载的解析163 4.8.4重载与覆盖的区别165 4.9运行时多态165 4.9.1实例方法的运行时多态165 4.9.2成员变量运行时的表现167 4.9.3静态方法运行时

62,623

社区成员

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

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