2017-05-29 84 views
2

我已經調查了很多不同的問題和答案,但找不到一個似乎工作。Java:刷新我的jTable在兒童jDialog數據更新後

我是新來的Java,但有各種不同語言的經驗,到目前爲止(與我正在嘗試的內容有關),它感覺有點像VBA,除了必須構建動作/你覺得應該已經存在的功能。儘管如此,我認爲,這只是我自己的缺乏經驗。

我正在使用Netbeans IDE 8.2與Java運行時間1.80。

我已經創建了包含jTable的jFrame。 JTable中與數據建立像這樣:

public void showTasks(Boolean removeID) { 
    ArrayList<Tasks> list = tasksList("SELECT * FROM tasks"); 
    JTable table = jTable1; 
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel(); 
    Object[] row = new Object[4]; 
    for(int i=0;i<list.size();i++) { 
     row[0]=list.get(i).getId(); 
     row[1]=list.get(i).getName(); 
     row[2]=list.get(i).getDesc(); 
     row[3]=list.get(i).getDate(); 
     model.addRow(row); 
    } 
    // Remove the 'id' column from the table view 
    if(removeID) { table.removeColumn(table.getColumnModel().getColumn(0)); } 
} 

這背後的背景是不太相關,但本質上tasksList是,查詢適用於SQL語句的函數,返回一個ArrayList。我用4列構建我的行,然後刪除第一列,以便「ID」可用但不可見(此最終操作已通過測試/實驗分離)。

我有另一個代碼區域,當單擊一行時可以打開一個jDialog,在這個區域中可以更新MySQL DB。

問題

我試圖讓表數據「刷新」時的JDialog關閉函數調用中拋出。我已經臨時添加了一個按鈕到jFrame(jTable所在的地方)來測試/調試這個函數。

雖然我似乎無法得到這個工作。我所取得的最接近的結果是重新調用showTasks(false),但這顯而易見只是增加了更新數據的行,而不是替換數據集。如果刪除所有行,那麼我不能100%確定,然後重新構建它們是'最佳實踐'。

由於我是Java新手,可能仍然從思考的缺陷來看待它,所以我發現很難將其他示例應用到我自己的示例中。我似乎也找不到實現fireTableDataChanged()的方法。

當然,這是一個簡單的概念,我過度思考?

編輯 - 基於下面的答案

有爲什麼這樣的事情會被認爲是不正確,如果要刪除所有行和是好的,加上他們回來的理由?

public void refreshTasks() { 
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel(); 
    int row_total = model.getRowCount(); 
    for(int i= row_total -1;i>=0;i--) { 
     model.removeRow(i); 
    } 
showTasks(false); 
} 

編輯:按鈕調用數據更新

現在工作正常(如果不恰當地)以下各項:

private DefaultTableModel parentTable;  // To store the parent 'Task' table model 

public void setStart(int user,DefaultTableModel table) { 

    this.txt_taskID.setText(Integer.toString(user)); // Converts the ID to a string 
    addData(user);   // Populates the fields 
    parentTable = table; // Sets parent TableModel to a variable 

} 

上面的代碼是從父JFrame中調用的時候,打開對話框,並傳遞我希望編輯的行的表模型和'ID'。表格模型存儲在parentTable中。

還有一個「保存」按鈕和一個「取消」按鈕。我還沒有分開這些,現在'保存'就是這樣做的(SQL更新等)。我的「取消」按鈕關閉對話框,並刷新JTable中,按照下面的功能:

private void btn_CancelActionPerformed(java.awt.event.ActionEvent evt) { 

    this.setVisible(false);   // Hide the dialog 
    Menu menu = new Menu();   // for accessing the tasksList function 

    parentTable.setRowCount(0);  // Clears the jTable data 

    // jTable data is then 'rebuilt' using the new data 

    ArrayList<Tasks> list = menu.tasksList("SELECT * FROM tasks"); 
    Object[] row = new Object[4]; 
    for(int i=0;i<list.size();i++) { 
     row[0]=list.get(i).getId(); 
     row[1]=list.get(i).getName(); 
     row[2]=list.get(i).getDesc(); 
     row[3]=list.get(i).getDate(); 
     parentTable.addRow(row); 
    } 
} 

回答

2

我不是100%:

btnDelete.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      int rowIndex = table.getSelectedRow(); 
      if(rowIndex > -1) { 
       int x = (Integer) table.getModel().getValueAt(rowIndex, 0); 
       if (conn.removeContact(x) == true) { //here add your own code like removeID 

        model.removeRow(rowIndex); 
        lblInfo.setText("Contact deleted successfully."); 
        model.fireTableDataChanged(); 
       } else { 
        lblInfo.setText("Cannot remove at this time!"); 
       } 
      }else { 
       lblInfo.setText("At first you need select a row with single click!"); 
       return; 
      } 
     } 
    }); 

,並在原始的方式令人耳目一新這些表如下代碼當然,如果刪除所有行,然後重新構建它們是'最佳實踐'。

是的,這可能是最佳做法。

唯一的另一種方法是創建一個全新的TableModel並使用setModel()方法將其添加到表中。這種方法的問題是它會重置您可能在桌面上設置的任何自定義渲染器/編輯器。

從的DefaultTableModel刪除所有行的最簡單的方法是隻使用:

model.setRowCount(0); 
+0

謝謝 - 這無疑是一個更簡化的刪除當前行的方法。 出於某種原因,我還沒有發現,我不能從jDialog調用函數'refreshTasks',通過使用println作爲調試方法,我可以看到調用是正確的,但它只是不想修改表模型。 函數'refreshTasks'通過使用表單上的按鈕按照預期工作,但不是遠離jDialog。 –

+1

@ChrisJ,在創建對話框時傳遞對TableModel的引用。然後,當用戶點擊「保存」按鈕時,您只需更新TableModel中的數據。該表將重新繪製自己。 – camickr

+0

感謝 - 設法讓它按照需要工作,並使用您的建議更新了我的代碼! –

-1

我不知道你怎麼想這樣做,但我會給你刪除和清新簡單的例子JTable也許它對你有幫助。

這下面btnDelete的JButton添加到JFrame從表中刪除行:

btnRefresh.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      int rowCount = model.getRowCount(); 
      for (int i = rowCount - 1; i >= 0; i--) {//remove all rows 

       model.removeRow(i); 
      } 
      lblInfo.setText("Table datas updated successfully."); 

      for (Person p : conn.readAllContacts()) {//add all row from scratch 
       model.addRow(new Object[] { p.getId(), p.getName(), p.getLastName(), p.getPhone(), p.getEmail() }); 
      } 

     } 
    }); 
+0

感謝您的意見。 如果刪除和重建數據是一種有效的/可接受的方式去解決這個問題,爲什麼有人這樣更簡潔會有缺陷/不正確? (請參閱編輯的問題) –

+0

@ChrisJ不,它不是不正確,但不是最好的方法。 –

+0

如果您想查看此鏈接:http://docs.oracle.com/javase/7/docs/api/javax/swing/table/AbstractTableModel.html#fireTableDataChanged%28%29 –