2014-08-27 32 views
0

这里是我的代码:我不能在JTable中查看数据从定制表格模型

Object[][] refreshCartonCodesToTable = dbutils.checker.CartonCodesToTable(); 
String[] colnames = new String[6]; 
colnames[0] = selectCodes.invoiceTable.getColumnName(0).toString(); 
colnames[1] = selectCodes.invoiceTable.getColumnName(1).toString(); 
colnames[2] = selectCodes.invoiceTable.getColumnName(2).toString(); 
colnames[3] = selectCodes.invoiceTable.getColumnName(3).toString(); 
colnames[4] = selectCodes.invoiceTable.getColumnName(4).toString(); 
colnames[5] = selectCodes.invoiceTable.getColumnName(5).toString(); 

MyTableModel mod = new MyTableModel(refreshCartonCodesToTable, colnames); 
selectCodes.invoiceTable = new JTable(mod); 
selectCodes.invoiceTable.setVisible(true); 

自定义模型,如下图所示:

class MyTableModel extends DefaultTableModel { 

    public MyTableModel(Object data[][], Object columnames[]) { 
     super(data, columnames); 
    } 

    public Class getColumnClass(int col) { 
     if (col == 5) { 
      return Boolean.class; 
     } else { 
      return String.class; 
     } 
    } 

    @Override 
    public boolean isCellEditable(int row, int col) { 
     if (col == 0) //first column will be uneditable 
     { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 

表显示columnames但数据不diplayed 。该阵列有数据和样本输出如下所示:

250VV 250VV0575W20140819 false B1 19 August 2014 
250VV 250VV0561W20140819 false B1 19 August 2014 
250VV 250VV0560W20140819 false B1 19 August 2014 
250VV 250VV0559W20140819 false B1 19 August 2014 
250VV 250VV0558W20140819 false B1 19 August 2014 

有六列。第六列我想在单元格中放置一个复选框。

有人可以帮助我。

这里是CartonCodesToTable()的源代码;

public static Object[][] CartonCodesToTable() { 
     Object[][] array = null; 
     try { 
      dbutils.checker.connect_to_db_again_again(); 

      sqlcommand = "SELECT Product_ID, carton_code, scanned, batchno,date FROM carton_codes where scanned ='false' order by bno asc"; 
      rset = stmts.executeQuery(sqlcommand); 
      int row = 0; 
      while (rset.next()) { 
       rset.last(); 
       row = rset.getRow(); 
      } 

      array = new String[row][6]; 
      rset.beforeFirst(); 

      int x = 0; 
      while (rset.next()) { 
       array[x][0] = rset.getObject("Product_ID"); 
       array[x][1] = rset.getObject("carton_code"); 
       array[x][2] = rset.getObject("scanned"); 
       array[x][3] = rset.getObject("batchno"); 
       array[x][4] = rset.getObject("date"); 
       array[x][5] = false; 
       x += 1; 
      } 
      conn.close(); 

     } catch (SQLException e) { 
      e.printStackTrace(); 
      JOptionPane.showMessageDialog(null, e); 
     } 
     return array; 
    } 

当我使用array [x] [5] = false;我得到一个错误'java.lang.ArrayStoreException:java.lang.Boolean'所以我决定使用array [x] [5] =“false”;

+0

为什么你想返回一个java类? – reporter 2014-08-27 09:07:21

+0

我希望最后一列返回布尔类,以便显示复选框而不是打印真假 – benzinect 2014-08-27 09:09:14

+0

在我看来,这是一个奇怪的代码,我认为值的数据类型与组件-to的数据类型不兼容创建一个复选框需要。我只是建议让它变得简单一些,写下'true'或'false',或者尝试将它转换为primitiv布尔值。 – reporter 2014-08-27 09:28:48

回答

0

你没有提供像我建议的MCVE,所以很难说出发生了什么。我首先看到的是ResultSet的糟糕使用,你不需要做所有这些事情。例如您使用rs.last()

boolean last() throws SQLException - 将光标移动到此对象的最后一行。

关于ResultSet from API

默认ResultSet对象不可更新,并具有唯一的向前移动的光标。因此,只能从第一行到最后一行迭代遍历它。 有可能产生的滚动和/或更新(见API为例如何做到这一点)

所以,假设你没有做ResultSet滚动,这可以解释你得到的ResultSet对象没有结果,因为你已经将光标移动到了末尾,并且调用了rs.last()

这就是说,你不需要获得行数。改用动态数据结构来创建模型。只需使用Vector。如果您使用数组作为数据,则DefaultTableModel无论如何都会将其转换为Vector(引擎盖下)。

一种常用的方法是利用ResultSetMetaData类,并获得列计数并动态创建Vector<Vector<Object>>,并以此方式构建您的DefaultTableModel。例如:

public DefaultTableModel getModelFromResultSet(ResultSet rs) throws Exception { 

    ResultSetMetaData md = rs.getMetaData(); 
    int columnCount = md.getColumnCount(); 

    String[] cols = new String[columnCount]; 
    for (int i = 1; i <= columnCount; i++) { 
     col[i - 1] = md.getColumnName(i); 
    } 

    Vector<Vector<Object>> dataVector = new Vector<Vector<Object>>(); 
    while(rs.next()) { 
     Vector<Object> row = Vector<Object>(); 
     for (int i = 1; i <= columnCount; i++) { 
      row.add(rs.getObject(i)); 
     } 
     dataVector.add(row); 
    } 

    DefaultTableModel model = new DefaultTableModel(dataVector, cols) { 
     @Override 
     public Class<?> getColumnClass(int column) { 
      ... 
     } 
    }; 
    return model; 
} 

或者类似的东西。没有测试过它(对于任何错误),但基本概念在那里。

至于你ArrayStoreException,看看你在做什么

Object[][] array = null; 
... 
array = new String[row][6]; 

什么是这样做的地步。你正在使每个对象都必须是一个字符串。这可能不适合渲染。