Java 运行时未创建带有复选框的JTable问题表

Java 运行时未创建带有复选框的JTable问题表,java,swing,jtable,tablemodel,Java,Swing,Jtable,Tablemodel,谁能帮帮我吗。我正在尝试创建一个带有复选框的动态表。从数据库访问数据。但它并不是在运行时创建表。它正确地从数据库检索数据。但我不明白为什么它不在指定的面板(panTable)中创建表。代码如下: int tasktotr=0; Object[][] taskcells; JTable ttable; public void BuildTable() { Statement st; ResultSet rs; panTable.updateUI(); String qu

谁能帮帮我吗。我正在尝试创建一个带有复选框的动态表。从数据库访问数据。但它并不是在运行时创建表。它正确地从数据库检索数据。但我不明白为什么它不在指定的面板(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();
    }

}
int tasktotr=0;
对象[][]任务单元;
JTable和ttable;
公共void BuildTable(){
报表st;
结果集rs;
panTable.updateUI();
字符串查询=”;
试一试{
forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
conn=DriverManager.getConnection(“jdbc:odbc:dsndbPMA”,“”,“”);
st=conn.createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读);
query=“从任务中选择*”;
rs=st.executeQuery(查询);
rs.last();
tasktotr=rs.getRow();
System.out.println(“tasktotr=“+tasktotr”);
taskcells=新对象[tasktotr][6];
如果(任务总数>0){
int-cnt=0;
rs.beforeFirst();

对于(int c=0;c它不能正确显示的原因是
getValueAt
方法中的
ArrayIndexOutOfBoundsException
。表
taskcells
由六列创建(打印循环中也只有六列被填充和显示)但是表模型是用七列创建的。如果您更正了它,您的代码应该可以工作(尽管您没有在此处发布的代码部分可能仍然存在问题)


注释:您可以考虑从数据库中读取数据不是列而是行,即重新排列<代码> RS和<代码> C/<代码>循环。甚至可以完全省略<代码> C <代码>循环。

感谢您的回复和注释。我已经纠正了它,但是它仍然没有显示表。但是一次又一次地尝试。真的不是一个。我无法找到我的错误。在剩下的代码中,我刚刚在main类的构造函数中调用了这个BuildTable()。@bsm:它是否显示了面板?(即显示的是表的标题)可能您忘记了将panTable添加到框架中。@bsm:我只是在代码(jframe,main)周围编写了几行代码,并删除了数据库代码()。此版本在我的计算机上运行良好。请您试一试。它在其他方面与您向我们展示的代码相同。因此,我怀疑错误可能在您的数据库代码或主方法中。是的,此没有数据库代码的新版本正在我的计算机上运行并在运行时显示表。非常感谢您的帮助。我我会在另外两个部分发现我的错误。我忘了将面板的布局设置为边框布局。现在它可以工作了。