我无法在自定义表模型中查看JTable中的数据

时间:2014-08-27 09:03:32

标签: java swing 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,但数据未显示。数组有数据,样本输出如下所示:

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&#34 ;;

1 个答案:

答案 0 :(得分:0)

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

  

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

关于ResultSet from API

  

默认的ResultSet对象不可更新,并且只有一个向前移动的游标。因此,您只能迭代一次,并且只能从第一行到最后一行。 可以生成可滚动和/或可更新的ResultSet对象(有关如何执行此操作的示例,请参阅API)

假设你没有使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;
}

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

就您的ArrayStoreException而言,请查看您正在做的事情

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

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