2014-02-21 125 views
0

我無法更新我的JTableSwingWorker線程。我的代碼;從Swingworker線程填充jTable

public class FillTable extends SwingWorker<Void, Void> { 

     protected Void doInBackground() throws Exception { 
      ResultSet rsaccounts; 
      Statement stmt; 
      String queryaccounts = "select NAME from acc (nolock)\n" + "order by Name"; 

      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
      String connectionUrl = "jdbc:sqlserver://192.100.100.23;" + "databaseName=Dbacc;" + "user=" + "sa" + ";" + "password=" + "sapassword!" + ";"; 
      Connection con = DriverManager.getConnection(connectionUrl); 
      stmt = con.createStatement(); 
      rsaccounts = stmt.executeQuery(queryaccounts); 
      ResultSetMetaData rsmd = rsaccounts.getMetaData(); 


      Vector<String> columnNames = new Vector<String>(); 
      columnNames.add(rsmd.getColumnName(1)); 
      System.out.println(columnNames); 
      int columnCount = rsmd.getColumnCount(); 

      Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 

      while (rsaccounts.next()) { 
       Vector<Object> vector = new Vector<Object>(); 
       for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { 
       vector.add(rsaccounts.getObject(columnIndex)); 
       } 
       data.add(vector); 

      } 
      DefaultTableModel model = new DefaultTableModel(columnNames,data); 
      jTable3.setModel(model); 

      rsaccounts.close(); 
      stmt.close(); 
      return null; 

     } 
     public void done() { 
      SearchButton.setEnabled(true); 
      CreateButton.setEnabled(true); 
     } 

    } 

我在GUI的init組件中執行這個swingworker線程來填充程序啓動時的jtable。

fillAccList = new FillTable(); 
fillAccList.execute(); 

當程序啓動時,我在屏幕上看到[NAME],因爲我添加了這行System.out.println(columnNames);如你所見,用於擺動裝置的控制。但我的jtable沒有填充。任何想法 ?

+0

我會認爲這將工作。設置模型後,您可以嘗試在JTable上進行無效操作。 – Pace

+0

我現在嘗試,但沒有變化。 –

+0

啊,構造函數應該是'DefaultTableModel(data,columnNames)'。你有它倒過來。 – Pace

回答

2

DefaultTableModel的構造函數首先需要數據,然後是列名。

變化:

DefaultTableModel model = new DefaultTableModel(columnNames,data); 

要:

DefaultTableModel model = new DefaultTableModel(data, columnNames); 
+0

感謝您的解決方案。 –

2

不是一個excact答案,但很重要的一點:你不應該調用從doInBackground的JTable#則setModel()()。您的表格在EDT上運行,而您的SwingWorker在單獨的線程上運行。這意味着您從另一個線程更新EDT(表)上的組件。不要這樣做。相反,從doInBackground()返回表模型並將其設置爲done()。要在SwingWorker的done()中獲取表模型,請使用get()。這需要同步和可變的可見性。

根據定義,你的應用程序現在已經壞了。

+0

你確實是對的。因爲我想將textfield添加到我更新的jtable上的rowfilter的GUI上。我認爲你的建議非常重要。 –