Java 我无法从自定义表模型查看JTable中的数据
这是我的密码:Java 我无法从自定义表模型查看JTable中的数据,java,swing,jtable,Java,Swing,Jtable,这是我的密码: Object[]RefreshCartonDestOtable=dbutils.checker.CartonDestOtable(); String[]colnames=新字符串[6]; colnames[0]=selectCodes.invoiceTable.getColumnName(0.toString(); colnames[1]=selectCodes.invoiceTable.getColumnName(1.toString(); colnames[2]=select
Object[]RefreshCartonDestOtable=dbutils.checker.CartonDestOtable();
String[]colnames=新字符串[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=新的MyTableModel(RefreshCartonDestOtable,colnames);
selectCodes.invoiceTable=新JTable(mod);
选择Codes.invoiceTable.setVisible(true);
自定义模型如下所示:
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
类MyTableModel扩展了DefaultTableModel{
公共MyTableModel(对象数据[],对象列名称[]){
超级(数据、柱状图);
}
公共类getColumnClass(int-col){
如果(列==5){
返回Boolean.class;
}否则{
返回字符串.class;
}
}
@凌驾
公共布尔值可编辑(int行,int列){
if(col==0)//第一列将不可编辑
{
返回false;
}否则{
返回true;
}
}
}
该表显示了列名称
,但未显示数据。数组中有数据,示例输出如下图所示:
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
共有六列。第六列我想在单元格中放置一个复选框
谁能帮帮我吗
以下是CartonDestOtable()的源代码
当我使用数组[x][5]=false时;我得到一个错误'java.lang.ArrayStoreException:java.lang.Boolean',所以我决定使用数组[x][5]=“false” 你没有像我建议的那样提供MCVE,所以很难说是怎么回事。不过,我看到的第一件事是
ResultSet
使用不当,您不需要做所有这些事情。例如,使用rs.last()
-将光标移动到此ResultSet
对象中的最后一行
关于
默认的ResultSet
对象是不可更新的,其光标仅向前移动。因此,您只能遍历它一次,并且只能从第一行到最后一行。可以生成可滚动和/或可更新的ResultSet对象(参见API以获取如何执行此操作的示例)
因此,假设您没有使ResultSet
可滚动,这将解释您没有得到任何结果,因为您已将光标移动到调用rs.last()
也就是说,您不需要获得行计数。使用动态数据结构来创建模型。只需使用一个按钮。如果对数据使用数组,DefaultTableModel
无论如何都会将其转换为向量(在引擎盖下)
一种常见的方法是使用类并获取列计数,动态创建一个向量
,然后以这种方式构造您的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;
}
这样做有什么意义。您正在使每个对象都必须是字符串。这可能不适合渲染。为什么要返回java类?我希望最后一列返回boolean类,以便显示一个复选框,而不是打印true/False。在我看来,这是一个奇怪的代码,我认为值的数据类型与组件创建复选框所需的数据类型不兼容。我只建议将其简化为nessacary,并编写'true'或'false'或尝试将其转换为primitiv boolean。可能最好提供一个我们可以复制、粘贴、编译、运行并亲自查看您面临的问题isCellEditable()
可以简化为return col!=0
。
Object[][] array = null;
...
array = new String[row][6];