2014-07-16 89 views
0

我這裏有一個代碼,我就如何做這件事情的工作相當混亂。該計劃的目的是顯示我們目前的庫存清單。我希望它自動添加到我的表格中。我怎樣才能做到這一點?將空行添加到空白的java表中?

我的錯誤路線是

    String[] itemize = { s1,s2,s3,s4,s5,s6,s7,s8,s9,s0 }; 
       //invTable.addRow(itemize); 

我也包括我的代碼,以防萬一有人需要對其進行測試。謝謝!

invTable.setAutoCreateRowSorter(true); 
    invTable.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {{null, null, null, null, null, null, null, null, null, null}}, 
     new String [] { 
      "Item", "Code", "Weight", "Doctor", "Supplier", "Department", "Cost", "Price", "Quantity", "Threshold" 
     } 
    )); 

我認爲問題在於上面的代碼。

我終於做到了工作,感謝的人在這個網站上的幫助。我剛剛刪除了上面的代碼。

private void insertRows() throws SQLException, Exception{ 
     modelx = new DefaultTableModel(); 
     modelx.addColumn("Name"); 
     modelx.addColumn("ID"); 
     modelx.addColumn("Weight"); 
     modelx.addColumn("Doctor"); 
     modelx.addColumn("Supplier"); 
     modelx.addColumn("Department"); 
     modelx.addColumn("Cost"); 
     modelx.addColumn("Price"); 
     modelx.addColumn("Quantity"); 
     modelx.addColumn("Threshold"); 
           Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 

       database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:\\floresClinic.accdb;"; 
     conn = DriverManager.getConnection(database, "", ""); 
     s = conn.createStatement(); 
       rs = s.executeQuery("SELECT * FROM medItem "); 
       int cou = 0; 
        while(rs.next()) 
        { 
            s1 = rs.getString("productName"); 
            s2 = rs.getString("productID"); 
            s3 = rs.getString("productWeight"); 
            s4 = rs.getString("doctor"); 
            s5 = rs.getString("sName"); 
            s6 = rs.getString("department"); 
            s7 = rs.getString("unitCost"); 
            s8 = rs.getString("unitPrice"); 
            s9 = rs.getString("quantity"); 
            s0 = rs.getString("threshold"); 
            if(!s2.equals("Select?")){ 
            modelx.insertRow(0, new Object [] {s1, s2, s3, s4, s5, s6, s7, s8, s9, s0}); 
            //String[] itemize ={s1,s2,s3,s4,s5,s5,s7,s8,s9,s0}; 
            //System.out.println(s1+s2); 
            //modelx.addRow(itemize); 

            } 
          cou++; 
        } 

    } 

現在我唯一的問題是它顯示倒退。第一行包含我的數據庫表的最後一行。

+2

嘗試將行直接添加到TableModel而不是JTable ... – MadProgrammer

+1

您不應該將字符串提取爲unitCost,unitPrice,數量,閾值所有看起來屬於我的數字 – MadProgrammer

+1

此外命名insertRow()方法的語義意味着該方法應該一次只插入一行。我不認爲每次添加一行時都應該創建一個新的表格和表格模型。除非我對方法名稱錯誤。只是一個想法。 –

回答

0

所以這裏有一個問題。當您拖放表,涉及初始化表格並添加表格到容器的過程中的一切,是intComponents方法內部處理。所以,在你的情況下,新增JTable

但在你insertRow你讓invTableJTable一個新實例做

invTable = new JTable(model); 

那麼,什麼是最終發生的是,在構造函數中,initComponens()被調用,初始化,並增加了原始表。但後來insertRow()被調用,這使得invTable成爲一個完全不同的實例。

所以,你應該做的,而不是,只是取出invTable = new JTable(model);。你可以創建一個新的DefaultTableModel這很好。我真的建議它(爲模型的addRow()調用將導致重繪,這是低效)在這種情況下。在所有的行添加到新的模型,然後調用invTable.setModel(model);


「我唯一的問題是現在,它向後所示。第一行包含我的數據庫表中的最後一行」

這是你的問題

modelx.insertRow(0, ....) 
       ^
       | 

你保持插入到第0行,這將推動所有以前添加的行了下來,因此「落後」。您可能想要使用insertRow(cou, ....) ..但這是不必要的。只需使用modelx.addRow(...);

0
invTable = new JTable(); 
invTable.setModel(modelx) 

// you CAN'T SKIP .setColumnIdentifiers() or your rows won't show up    
    modelx.setColumnIdentifiers("col1","col2","col3","col4","col5","col6","col7","col8","col9","col0"); 

然後,通過調用.addRow()方法中添加使用的DefaultTableModel的參考這些行..

while(rs.next()){ 
    ............ 
    ............ 

    modelx.addRow(new Object[]{s1,s2,s3,s4,s5,s5,s7,s8,s9,s0}); 

} 
  • 這是我很難對代碼進行測試,因爲我沒有那種數據庫,但我的解決方案應該工作!
+0

現在@Fev沒有錯誤,它只是不顯示我的表單上的行。我認爲它的工作,有一些我錯過了。 – Daniel

+0

@Daniel,試着改變這一行invTable = new JTable(modelx); TO invTable = new JTable();那麼invTable.setModel(modelx)。看看它是否有效。 –

+0

仍然無法正常工作。對不起。 – Daniel