2013-12-13 37 views
0

我是一个应该是2列(String,JComboBox)的JTable。当我初始化表格时,一切看起来不错。只要我在表格中选择一个值,JComboBox单元就会获得所选项目的数据类型。JTable单元格编辑器改变类型

我想保留JCOmboBox并让它触发数据更改的事件,并且表忽略该列中的数据更改并保持组合框已填充。

我的表有此作为一个覆盖

@Override 
public TableCellEditor getCellEditor(int row, int column) { 
    Object value = super.getValueAt(row, column); 
    if (value != null) { 
     if (value instanceof JComboBox) { 
      return new DefaultCellEditor((JComboBox) value); 
     } 
     return getDefaultEditor(value.getClass()); 
    } 
    return super.getCellEditor(row, column); 
} 

实施

JComboBox uploadBox = new JComboBox(); 
    uploadBox.addItem(MyPanel.UPLOAD_OPTIONS.PROMPT); 
    uploadBox.addItem(MyPanel.UPLOAD_OPTIONS.UPLOAD); 
    uploadBox.addItem(MyPanel.UPLOAD_OPTIONS.DONT_UPLOAD); 

    Object[][] tableData = new Object[][]{ 
     {"Upload data on save", uploadBox} 
    }; 



    table.setModel(
      new DefaultTableModel(tableData, new String[]{"Description", "Options"}) { 
     Class[] types = new Class[]{String.class, JComboBox.class}; 
     boolean[] canEdit = new boolean[]{false, true}; 

     @Override 
     public Class getColumnClass(int columnIndex) { 
      return types[columnIndex]; 
     } 

     @Override 
     public boolean isCellEditable(int rowIndex, int columnIndex) { 
      return canEdit[columnIndex]; 
     } 


    }); 

    table.getColumnModel().getColumn(1).setCellRenderer(new TableCellRenderer() { 

     @Override 
     public Component getTableCellRendererComponent(JTable jtable, Object o, boolean bln, boolean bln1, int i, int i1) { 
      return (Component)o; 
     } 
    }); 

回答

3
  • 答案非常简单,不要把JComboBoxXxxTableModel或设置为getColumClassJComboBox.class,这是错误(当然是可能的,但有一堆副作用),XxxTableModel(指定为)可以直接容纳只有s TANDARD Java数据类型(StringDateIcon/ImageIconIntegerDouble等)

  • XxxTableModel应该是存储(如果你不想Java数据类型之间解析)相同的数据类型等作为被存储在DefaultComboBoxModel(指出清楚CONSTANS是MyPanel.XXX),例如在XxxTableModel存储String值时DefaultComboBoxModel具有相同的数据类型,为Date similair逻辑,Icon/ImageIconIntegerDouble

  • 更多信息阅读甲骨文教程How to use Tables - Using a Combo Box as an Editor

+0

@meriley我这里用SSCCE形式代码的一些帖子,在Java +摆动标记+ JTable的JComboBox的+我 – mKorbel

+0

问题是,每一行都有不同的JComboBox (它们存储不同的数据),而提供的示例是所有行的统一数据集。 – meriley

+0

@meriley每一行都有不同的JComboBox--这不是任何问题,有三种方法如何为分隔的DefaultComboBoxModel保存不同的值(不需要定义是始终创建的),但是任何从他们开始都将JComboBox模型化,渲染器被指定为列和行坐标,或者存储在Map中或者存储在Vector , – mKorbel

相关问题