2014-12-04 91 views
0

我從訪問數據庫填充JTable。當第一次運行代碼時,表格加載完美。然後從JDialog向數據庫添加新記錄。我試圖做的是在JDialog關閉時調用loadData()方法,但表不更新。如何在向數據庫插入數據後刷新JTable?

這是我loadData()方法:

private void loadData() { 
    System.out.println("sssss"); 
    final String [] columnNames={"Seq", "First Name", "Last Name","Num1","Num2","Num3"}; 
    connectDb(); 

    data = new Object[rows][columns]; 
    int row = 0; 
    try { 
     while(rs.next()){ 
      for(int col = 0 ; col<columns; col++){ 
       if(col==0) 
        data[row][col]=rs.getString("contact_seq"); 
       if(col==1) 
        data[row][col]=rs.getString("contact_fname"); 
       if(col==2) 
        data[row][col]=rs.getString("contact_lname"); 
       if(col==3) 
        data[row][col]=rs.getString("contact_num1"); 
       if(col==4) 
        data[row][col]=rs.getString("contact_num2"); 
       if(col==5) 
        data[row][col]=rs.getString("contact_num3"); 


      } 
      row++; 
     } 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    model = new DefaultTableModel(data, columnNames){ 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

     public boolean isCellEditable(int row, int column) 
     { 
      return false; 
     } 



    }; 

    table = new JTable(model); 
}` 

這個我怎麼稱呼loadData方法關閉的JDialog時。

JMenuItem mntmNew = new JMenuItem("New Contact"); 
    mntmNew.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      addData gui = new addData(viewData.this,rs); 
      gui.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
      gui.setVisible(true); 
      gui.addWindowListener(new WindowAdapter() { 
       public void windowClosed(WindowEvent e){ 
        loadData(); 
       } 
      }); 
     } 
    }); 
    mnFile.add(mntmNew); 

我的數據庫在添加記錄時更新,但Jtable沒有刷新。

回答

4

這裏:

private void loadData() { 
    ... 
    table = new JTable(model); // don't re-create the table here 
} 

不要重新創建表,而是,通過設置一個新的表模型或通過清除並重新填充當前的更新它的模型:

private void loadData() { 
    ... 
    table.setModel(model); 
    // Of course, table should have been initialized 
    // and placed first, and only once! 
} 

查看示例here(包括SwingWorker在後臺線程中進行數據庫調用),herehere。請看看這些答案,有解釋說明這一點。

+1

謝謝dic19。這對我有用。我在構造函數方法中添加了'table = new JTable(model)',然後在構造函數方法中添加了'loadData()'方法。我的桌子需要一些時間來加載。所以現在我要做和你的例子一樣的改變。 – 2014-12-05 03:56:51

0

這是一個在黑暗中拍攝,但也許這將工作?:

public void windowClosed(WindowEvent e) { 
    loadData(); 
    // Add this line: 
    table.repaint(); 
} 

如果我明白是怎麼回事,底層數據庫得到更新,但JTable組件沒有顯示更新。我的猜測是你只需要調用repaint()方法,以便JTable也得到更新。

+0

謝謝nihilon。這對我不起作用。但是我將更多地瞭解'repaint()'方法。 – 2014-12-05 03:59:10

+0

不用擔心@broken_code,我的猜測是錯誤的。方式錯了。但這就是我們來這裏的原因,對吧?學習! – nihilon 2014-12-08 02:30:06

0

這爲我工作:

if (model.getRowCount() > 0) { 
    for (int i = model.getRowCount() - 1; i > -1; i--) { 
     model.removeRow(i); 
    } 
} 

setTablevalue(); 

我刪除了所有來自JTable行,並再次叫setTableValue方法重新填充表。

相關問題