我已經調查了很多不同的問題和答案,但找不到一個似乎工作。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);
}
}
謝謝 - 這無疑是一個更簡化的刪除當前行的方法。 出於某種原因,我還沒有發現,我不能從jDialog調用函數'refreshTasks',通過使用println作爲調試方法,我可以看到調用是正確的,但它只是不想修改表模型。 函數'refreshTasks'通過使用表單上的按鈕按照預期工作,但不是遠離jDialog。 –
@ChrisJ,在創建對話框時傳遞對TableModel的引用。然後,當用戶點擊「保存」按鈕時,您只需更新TableModel中的數據。該表將重新繪製自己。 – camickr
感謝 - 設法讓它按照需要工作,並使用您的建議更新了我的代碼! –