这是我的代码:
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 ;;
答案 0 :(得分:0)
你还没有像我建议的那样提供MCVE,所以很难说出发生了什么。我看到的第一件事是使用ResultSet
你不需要做所有这些事情。例如,您使用rs.last()
。
boolean last() throws SQLException
- 将光标移动到此ResultSet
对象的最后一行。
默认的
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];
这样做的目的是什么。你正在使它每个对象必须是一个字符串。这可能不适合渲染。