我正在向我的JTable添加一个空行(实现AbstractTableModel)。我如何实时更新我的​​模型?

问题描述:

好的,我认为标题是我必须要问的。我正在向我的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

您可以通过比较几种方法得到更好的理解:

  • 在这种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