2013-03-02 64 views
0

好的,我認爲標題是我必須要問的。我正在向我的JTable添加一個空行(實現AbstractTableModel)。我如何實時更新我的​​模型?

AbstractTableModel工作正常,當我想添加一個空行,我用下面的代碼可以這樣做:

public void addRow() { 
    Object[][] oldData = data; 
    data = new Object[oldData.length + 1][3]; 

    // Copy old data to new data 
    for (int x = 0; x < oldData.length; x++) { 
     data[x] = oldData[x]; 
    } 

    // Append new row 
    data[oldData.length] = new Object[] {"", "", false}; 

    fireTableRowsInserted(data.length - 2, data.length - 1); 
} 

現在,因爲我展示一個空行,我希望用戶編輯它,我假設用戶會。現在,如何確保在用戶進行更改時將數據保存在數組中?或者,如果這是不可能的,還有什麼更好的選擇?

好了,所以我應該解釋一下我想做的事:

enter image description here

我從文件加載內容,並顯示爲表。現在,用戶可以通過單擊Add Row按鈕向表中添加新行。這會爲每次點擊添加1個空行。 (在這個圖片上面是一個按鈕被按下兩次的實例)

現在,我希望用戶可以編輯單元格,然後刪除一些行(可能),但點擊Save Database按鈕後,更新的數據在錶店

+0

有些問題需要澄清你想要做什麼:你想只保存*修改/添加的那些行或所有的表?你試過什麼了?您似乎對目前爲止的操作有很好的理解,但對於卡在哪一部分並不清楚(3) – asermax 2013-03-02 06:00:17

+0

只需使用'DefaultTableModel'即可。您可以使用'addRow(...)'方法添加一個空行。 DefaultTableModel也有一個'removeRow(...)'方法。 – camickr 2013-03-02 06:04:26

+0

@asermax我想保存完整的更新表,這意味着添加/刪除後表中的所有內容。 – 2013-03-02 16:38:09

回答

2

您可以通過比較幾種方法得到更好的理解:

  • 在這種example,無論是後臺線程或按鈕可以添加一個新行到表的背景。通過invokeLater()在EDT上的線程序列Runnable的實例。它在概念上更容易理解,但也更容易出錯。

  • SwingWorker封裝測序訪問共享數據。 APItutorial顯示使用publish()/process()更新組件模型的基本方法。這個首選機制更健壯並且可擴展。

  • 在這種更先進的example,一個Swing Timer踱步控制一系列SwingWorker實例的Executor

在所有情況下,表格仍然有效。您可以使用任何作爲sscce的基礎。

附錄:您能否更詳細地解釋一下您提出的策略?

我已經更新了示例列表,並提出了一些要在上下文中查找的內容。

+0

我不太擅長'Thread'。你能解釋一下你提出的策略嗎? – 2013-03-02 16:53:20

+2

@ user2059238,答案提供了工作示例的鏈接,供您查看和嘗試。 – camickr 2013-03-02 16:59:19

+0

正如@camickr所建議的,您可能想要比較這些方法。我已經更新了包含一些中間材料的答案。作爲第一個示例使用複選框,請考慮將其轉換爲使用'SwingWorker'。 – trashgod 2013-03-02 18:48:43

相關問題