作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
谁能帮帮我。我正在尝试创建一个带有复选框的动态表。数据是从数据库访问的。但它不是在运行时创建表。它正确地从数据库检索数据。但我不明白为什么它不在指定的面板(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();
}
}
最佳答案
它无法正确显示的原因是 getValueAt
方法中的 ArrayIndexOutOfBoundsException
。表 taskcells
创建有六列(也只有六列被填充并显示在打印循环中),但表模型创建有七列。如果您更正它,您的代码应该可以工作(尽管您未在此处发布的代码部分中可能仍然存在问题)。
注意:您可以考虑从数据库中不按列读取数据,而是按行读取数据,即重新排列 rs
和 c
循环。然后您甚至可以完全省略 c
循环。
关于java - 带有复选框问题的 JTable - 运行时未创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5204014/
我是一名优秀的程序员,十分优秀!