当前位置: 代码迷 >> Java相关 >> Jtable 设立每行数据前后关联
  详细解决方案

Jtable 设立每行数据前后关联

热度:729   发布时间:2016-04-22 20:46:57.0
Jtable 设置每行数据前后关联
本帖最后由 u011642236 于 2014-12-14 22:19:04 编辑
比如说,在Jtable中,同一行数据,有三列,均为Combo box编辑器,第二列的数据要在第一列选择后才有可选值,同样第三列要在第二列选择后才有可选值,这样的逻辑,对于Jtable要怎么写程序?

我实际的需求是相当于数据库表的主键是其他表的外键,比如表A是品牌,表B是产品线,表C是系列,关联关系是一个品牌对应多个产品线,一个产品线又对应多个系列。。。

求指导,或者有个简单的例子,先谢谢大家了!
------解决思路----------------------
第一个怎么绑定的数据,就在第一个onchange函数里,获得第2个数据再绑定就可以了呗
------解决思路----------------------
查查JComboBox的文档,肯定有选择值以后的事件,和绑定值的方法。然后选择值的事件里从新绑定2的数据就可以了
------解决思路----------------------

public class MyCellEditor ... {
     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,  int row,    int column) {
            // 如果不是 1,2,3 列,默认值,用 JTextField 并且所有数据当成String 来处理数据。

             if (column > 2) {
                         JTextField editor = new JTextField();  
                         editor.setText(value == null ? "" : value.toString()); 
                         return editor;
               }             

             List options = new ArrayList();
              if (column == 0) {
                    // 查询数据库拿 column 1 的 options 列表。
              }    else if (column == 1) {
                    String column1Value = table.getModel.getValueAt(row, column - 1);
                    // 查询数据库拿 column 2 的 options 列表,参数是 column1Value.
              }  else if (column == 2) {
                    String column2Value = table.getModel.getValueAt(row, column - 1);
                    // 查询数据库拿 column 3 的 options 列表,参数是 column2Value.
              }

              JComboBox editor = new JComboBox(options);
              editor.setSelectedValue(value);

              return editor;
    }
}


引用:
重新排版一下:

 JTable Cell Editor 文档


public Component getTableCellEditorComponent(JTable table,
                                    Object value,
                                    boolean isSelected,
                                    int row,
                                    int column)
 
JTable 大致过程如下:
1、当表格准备刷新显示时,按行列逐个单元格处理,先问 table 的
              cell renderer .getTableCellRendererComponent(...) 
这个 (row, column) 坐标的单元格它的 cell renderer component 是什么,默认地是 JLabel,
我们可以在自己的 TableCellRenderer 实现类中告诉 JTable 我们要给一个 JCombox ,
当然我们也要把传入的这个格子的值填充到 JCombox 上之后返回 JCombobox 给它,
然后 JTable 就会拿这个 JCombobox 去 painting 画界面;然后再对下一下单元格做重复前面的事情。

2、当我们输入焦点移动到一个单元格时,它会先问 table cell editor 是否 isCellEditable(...),
如果  true,那它会再来 getTableCellEditorComponent (...) 得到一个 table cell editor component,
默认它是 JTextField,这时你需要返回一个 JCombobox  这一步我知道你已经知道怎么回事,
当然也是在返回这个 JComboBox 之前把传入的当前单元格的值填充到 JCombobox 上之后
再返回这个 JComboBox 了,这时输入过程开始,用户改变 JComboBox 的值,确定之后
 JTable 会把值更新回到 Table model 中去,然后结束了这次 editing 的周期,这时当前格子
有焦点,再回到上面第1步去执行 rendering 过程更新界面。


这里我们不能直接使用 DefaultTableCellEditor,而是继承它,然后在getTableCellEditorComponent (...) 方法中我们知道它当前正发处理哪行哪列(参数中已经传入了),我们去 table model 中找它的当前行的前一列的值,查询数据库得到可用的下拉列表值,更新一下 JComboBox 的 options,然后返回这个 JComboBox 作为 table cell editor component。

当然为了减少查询数据库的时间,可能在我们保存界面上的数据之前我们都在这个 cell editor 实例中用 map 缓存一下查询的下一级 options 列表吧,保存数据之后就丢弃它们来清理内存占用。
  相关解决方案