我正在向我的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);
}
现在,因为我展示一个空行,我希望用户编辑它,我假设用户会。现在,如何确保在用户进行更改时将数据保存在数组中?或者,如果这是不可能的,还有什么更好的选择?
好了,所以我应该解释一下我想做的事:
我从文件加载内容,并显示为表。现在,用户可以通过单击Add Row
按钮向表中添加新行。这会为每次点击添加1个空行。 (在这个图片上面是一个按钮被按下两次的实例)
现在,我希望用户可以编辑单元格,然后删除一些行(可能),但点击Save Database
按钮后,更新的数据在表店
答
您可以通过比较几种方法得到更好的理解:
在这种example,无论是后台线程或按钮可以添加一个新行到表的背景。通过
invokeLater()
在EDT上的线程序列Runnable
的实例。它在概念上更容易理解,但也更容易出错。SwingWorker
封装测序访问共享数据。 API和tutorial显示使用publish()
/process()
更新组件模型的基本方法。这个首选机制更健壮并且可扩展。在这种更先进的example,一个Swing
Timer
踱步控制一系列SwingWorker
实例的Executor
。
在所有情况下,表格仍然有效。您可以使用任何作为sscce的基础。
附录:您能否更详细地解释一下您提出的策略?
我已经更新了示例列表,并提出了一些要在上下文中查找的内容。
有些问题需要澄清你想要做什么:你想只保存*修改/添加的那些行或所有的表?你试过什么了?您似乎对目前为止的操作有很好的理解,但对于卡在哪一部分并不清楚(3) – asermax 2013-03-02 06:00:17
只需使用'DefaultTableModel'即可。您可以使用'addRow(...)'方法添加一个空行。 DefaultTableModel也有一个'removeRow(...)'方法。 – camickr 2013-03-02 06:04:26
@asermax我想保存完整的更新表,这意味着添加/删除后表中的所有内容。 – 2013-03-02 16:38:09