任何人都可以帮助我。我正在尝试使用复选框创建动态表。数据从数据库访问。但它不是在运行时创建表。它正确地从数据库中检索数据。但我不知道它为什么不在指定的Panel(panTable)中创建表。以下是代码:
int tasktotr=0;
Object[][] taskcells;
JTable ttable;
public void BuildTable() {
Statement st;
ResultSet rs;
panTable.updateUI();
String query="";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection("jdbc:odbc:dsndbPMA","","");
st=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
query="select * from Task";
rs=st.executeQuery(query);
rs.last();
tasktotr=rs.getRow();
System.out.println("tasktotr="+tasktotr);
taskcells=new Object[tasktotr][6];
if(tasktotr>0){
int cnt=0;
rs.beforeFirst();
for(int c=0;c<6;c++){
if(c==cnt){
int r=0;
while(rs.next()){
if(c==0)
taskcells[r][c]=Boolean.FALSE;
else if(c==1)
taskcells[r][c]=rs.getString("Priority");
else if(c==2)
taskcells[r][c]=rs.getString("Subject");
else if(c==3)
taskcells[r][c]=rs.getString("Status");
else if(c==4)
taskcells[r][c]=rs.getString("DueDate");
else if(c==5)
taskcells[r][c]=rs.getString("%Complete");
else if(c==6)
taskcells[r][c]=rs.getString("Category");
r++;
}
}
rs.beforeFirst();
cnt++;
}
rs.close();
st.close();
for(int i=0;i<tasktotr;i++){
for(int j=0;j<6;j++){
System.out.println(taskcells[i][j]);
}
}
TableModel tasktable=new TaskTableModel(tasktotr,7);
ttable=new JTable(tasktable);
TableColumnModel columnModel=ttable.getColumnModel();
TableColumn column;
for(int i=0;i<ttable.getColumnCount();i++) {
column = columnModel.getColumn(i);
if(i==0)
column.setPreferredWidth(40);
if(i==1)
column.setPreferredWidth(40);
if(i==2)
column.setPreferredWidth(150);
}
ttable.setRowHeight(18);
ttable.setAutoResizeMode(ttable.AUTO_RESIZE_OFF);
ttable.getTableHeader().setReorderingAllowed(false);
JScrollPane scroll=new JScrollPane(ttable);
scroll.setAutoscrolls(true);
panTable.add(scroll);
panTable.updateUI();
panTable.revalidate();
}
}catch(Exception e){
e.printStackTrace();
JOptionPane.showMessageDialog(null,e.getMessage(),"Error!!",1);
}
}
class TaskTableModel extends AbstractTableModel{
int totrow,totcol;
public TaskTableModel(int r,int c){
totrow=r;
totcol=c;
}
@Override
public int getRowCount() {
return totrow;
}
@Override
public int getColumnCount() {
return totcol;
}
public Object getValueAt(int r,int c) {
return taskcells[r][c];
}
public String getColumnName(int c){
if(c==0)
return "Icon";
else if(c==1)
return "Priority";
else if(c==2)
return "Subject";
else if(c==3)
return "Status";
else if(c==4)
return "Due Date";
else if(c==5)
return "% Completed";
else if(c==6)
return "Category";
else
return "";
}
public void setValueAt(Object obj,int r,int c){
taskcells[r][c]=obj;
fireTableCellUpdated(r, c);
}
//Edit only first column.
public boolean isCellEditable(int r,int c){
return c==0;
}
//used to display checkbox else it will show true/false text instead of checkbox. n
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}
答案 0 :(得分:2)
无法正确显示的原因是ArrayIndexOutOfBoundsException
方法中的getValueAt
。表taskcells
创建了六列(也只有六列填充并显示在您的打印循环中),但表模型创建了七列。如果你的说法正确,你的代码应该可行(尽管代码部分中可能仍然存在问题,你没有在这里发布)。
注意:您可以考虑从数据库中按行而不是逐行读取数据,即重新排列rs
和c
循环。然后你甚至可以完全省略c
- 循环。