我来送分!jtable中嵌入jcombobox问题. 这不是数据库的问题吧.表如下idref_idname---------------------------------数据,如 1 0 中国 2 0 美国 3 1 四川 4 1 山东 5 3 成都等等. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 上面是存储国家\省份\城市的数据库表.而与jtable相关的表就随便了吧如kehu(table)--------------------idname (客户名)guojia shengfenchengshi等等 我写的是通用控件,贴代码没什么,举个简单的例子吧JCombobox guo= new JCombobox();guo.addActionListener(this);JCombobox sheng = new JCombobox();shenng.addActionListener(this);...............................table.getcolumn(0).setcellEditor(guo);table.getcolumn(1).setcellEditor(sheng);........................public void actionperformed(ActionEvent e){ //判断时间并处理}/////////////////////////////////这儿我只随便写了一点,实际中我自定义了cellEditor. 这个问题很简单,跟数据库什么的没关系,主要原因是你不能使用同一个JComboBox的实例作为不同行的绘制器,因为如果是同一个实例的话,那么你修改其中一个引用的值,其他的值也就随之修改了所以:1、如果是绘制器的话,请在每个TableCellRenderer的getTableCellRendererComponent里new一个来返回。当然,每次new一个非常影响效率,那么折中的方案是用个HashMap什么的把row和TableCellRenderer的对照关系保存起来,用的时候先HashMap.get(row),有就返回,没有则new2、编辑器的实例可以是同一个,但请不要使用外部加监听的方式,应该你的CellEditor的getTableCellEditorComponent和TableModel的getValueAt()和setValueAt()方法让Table进行自适应,不要试图用外部监听器来修改TableModel里的值 编辑器的实例可以是同一个,但请不要使用外部加监听的方式,应该修改(刚刚忘写这俩字)你的CellEditor的getTableCellEditorComponent和TableModel的getValueAt()和setValueAt()方法让Table进行自适应,不要试图用外部监听器来修改TableModel里的值 另外,非常不建议用JComboBox作绘制器,1是影响效率,2是没什么意义,因为绘制器只是显示用的,所以JComboBox和JLabel没什么区别 to relive(六道轮回,无想转生) 其实,我就是想用jtable作为输入工具,因为做输入的panel太麻烦了.不知你有什么好的方法没有,关于panel界面.谢谢,我先试一下 CellRenderer 我说的是:“非常不建议用JComboBox作绘制器”,但没说不能作编辑器啊,楼主理解错误,呵呵JTable其实挺简单的因为没有源码,我简单说说吧首先,你的Renderer不要用JComboBox其次,把你所有的JComboBox.addActionListener()和JComboBox.addItemListener()去掉这样你可能会问,那我在修改完国家后怎么把省份的JComboBox换过来呢?OK,我们假设你的国家是第一列,省份是第二列,省份使用了一个JComboBox的CellEditor那么省份编辑器可以如下 public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { JComboBox combobox = //你的省份编辑器 Object objGuo = table.getModel().getValueAt(row,0);//获得你所在行的国家 String strGuo = objGuo.toString(); if(strGuo.equals("中国")) {//把中国的省份加入 combobox.removeAll(); combobox.addItem()......; } else if(strGuo.equals("USA")) {//把美国的省份加入 combobox.removeAll(); combobox.addItem()......; } return combobox; }当然,我只是简单写写,有很多相关处理比如颜色、焦点什么就不详细说了,自己看看DefaultCellEditor的源码还有,为了提高效率,可以在省份Editor里保存一个国家属性,每次用的时候先与用的国家比较一下,如果相同就不用removeAll()和addItem()了 现在的csdn有点拽,以前Norton防火墙允许他的refer\cookie就行了.现在,允许了也不行,必须关Norton才能发帖,真不知还要设置什么????????????/ “另外,我本想在Editor中使用监听器进行存库处理.可是经调试发现,在点击combox后,即执行actionPerformed”一定要用的话就用addItemListener,因为它只响应ItemStateChange另外removeAll和addItem会发出ItemStateChange所以一定要用的话就得为每个国家new一个单独的实例来使用class CellEditor{private HashMap amap = new HashMap();public JComboBox getComboBox(String country){ JComboBox combobox = (JComboBox)amap.get(country); if(combobox==null) { combobox = new JComboBox(); //把省份加进去 combobox.addItemListener(yourlistener); amap.put(country,combobox); } return combobox;}public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { Object objGuo = table.getModel().getValueAt(row,0);//获得你所在行的国家 String strGuo = objGuo.toString(); JComboBox combobox = getComboBox(strGuo);//你的省份编辑器 return combobox;}}这么说能明白吧 如果你的要求更严格的话,那么JComboBox可以按行来实例化,每行一个新的Instance 关于参数返回的问题,返回一个数组后,怎么限制修改数组的值, SWT, table无法显示出来? 数据库查询用表输出问题 新手求解一for语句 socket问题 那位高手帮我看下啊!!!!!!!!!!!!! 关于wrapper类的使用 大数据量如何解决(在线等) 什么是超类? 大家都在谈Java,但是我都没有见过Java的case jbuilder7里如何不将jar文件解压到project工作目录的classes目录里,而直接测试现成的jar文件(不含.java文件)中的类和包 一个大家经常碰到的问题 如何使JScrollPane充满整个容器?
而与jtable相关的表就随便了吧
如
kehu(table)
--------------------
id
name (客户名)
guojia
shengfen
chengshi等等
JCombobox guo= new JCombobox();
guo.addActionListener(this);
JCombobox sheng = new JCombobox();
shenng.addActionListener(this);
...............................
table.getcolumn(0).setcellEditor(guo);
table.getcolumn(1).setcellEditor(sheng);........................
public void actionperformed(ActionEvent e){
//判断时间并处理
}/////////////////////////////////
这儿我只随便写了一点,实际中我自定义了cellEditor.
所以:
1、如果是绘制器的话,请在每个TableCellRenderer的getTableCellRendererComponent里new一个来返回。当然,每次new一个非常影响效率,那么折中的方案是用个HashMap什么的把row和TableCellRenderer的对照关系保存起来,用的时候先HashMap.get(row),有就返回,没有则new
2、编辑器的实例可以是同一个,但请不要使用外部加监听的方式,应该你的CellEditor的getTableCellEditorComponent和TableModel的getValueAt()和setValueAt()方法让Table进行自适应,不要试图用外部监听器来修改TableModel里的值
其实,我就是想用jtable作为输入工具,因为做输入的panel太麻烦了.
不知你有什么好的方法没有,关于panel界面.
谢谢,我先试一下 CellRenderer
JTable其实挺简单的
因为没有源码,我简单说说吧
首先,你的Renderer不要用JComboBox
其次,把你所有的JComboBox.addActionListener()和JComboBox.addItemListener()去掉
这样你可能会问,那我在修改完国家后怎么把省份的JComboBox换过来呢?
OK,我们假设你的国家是第一列,省份是第二列,省份使用了一个JComboBox的CellEditor
那么省份编辑器可以如下
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JComboBox combobox = //你的省份编辑器
Object objGuo = table.getModel().getValueAt(row,0);//获得你所在行的国家
String strGuo = objGuo.toString();
if(strGuo.equals("中国"))
{//把中国的省份加入
combobox.removeAll();
combobox.addItem()......;
}
else if(strGuo.equals("USA"))
{//把美国的省份加入
combobox.removeAll();
combobox.addItem()......;
}
return combobox;
}
当然,我只是简单写写,有很多相关处理比如颜色、焦点什么就不详细说了,自己看看DefaultCellEditor的源码
还有,为了提高效率,可以在省份Editor里保存一个国家属性,每次用的时候先与用的国家比较一下,如果相同就不用removeAll()和addItem()了
class CellEditor{
private HashMap amap = new HashMap();
public JComboBox getComboBox(String country){
JComboBox combobox = (JComboBox)amap.get(country);
if(combobox==null)
{
combobox = new JComboBox();
//把省份加进去
combobox.addItemListener(yourlistener);
amap.put(country,combobox);
}
return combobox;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
Object objGuo = table.getModel().getValueAt(row,0);//获得你所在行的国家
String strGuo = objGuo.toString();
JComboBox combobox = getComboBox(strGuo);//你的省份编辑器
return combobox;
}
}
这么说能明白吧