2014-02-21 37 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上。我认为你的建议非常重要。 –