我正在从.txt文件创建一个Jtable。 .txt文件在一段时间内不断更新。我需要知道是否有任何方法可以在我的Jtable AT RUN-TIME中反映.txt文件中的这些更改!我知道重新启动时,表读取.txt文件,但有没有办法在运行时执行?
答案 0 :(得分:3)
您应该编写一个后台线程,不断检查文本文件的内容并不断更新表模型。
答案 1 :(得分:3)
我想可能看起来像这样......
public class BackgroundMonitor implements Runnable {
public void run() {
while (true) {
// Check to see if the file has changed since the last update...
// If it has you will want to store the metrics and return true...
if (hasChanged()) {
// Load the contents into what ever construct you need to use
... = loadContents();
// Create a new model...
TableModel model = ... // create a new table model
// Apply the model to the table...
applyModel(model);
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(ThreadUpdates.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
protected void applyModel(final TableModel model) {
// Apply the model to the table, making sure you update within the
// EDT
try {
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
table.setModel(model);
}
});
} catch (InterruptedException | InvocationTargetException exp) {
// Handle the update exception....
}
}
}
这个问题是你每次强制表都要完全更新,这可能会变得很慢(随着数据量的增加)并且会使当前选择无效。
如果您可以确定最后一行,那么您最好只添加那些已更改的行...
在这种情况下,“apply”方法可能看起来像
protected void applyModel(final List<?> rowsToBeAdded) {
// Apply the model to the table, making sure you update within the
// EDT
try {
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
MyUpdatableModel model = (MyUpdatableModel) table.getModel();
model.addNewRows(rowsToBeAdded);
// You will need to call fireTableRowsInserted(int firstRow, int lastRow)
// indiciate where the new rows have been added, but this is best
// done in the model
}
});
} catch (InterruptedException interruptedException) {
} catch (InvocationTargetException invocationTargetException) {
}
}
这是一个更好的方法,因为它只需要表更新那些已更新的行,不应影响选择...
答案 2 :(得分:2)
除了Dan
所写的内容,要在后台线程中实际观察您的文件,您可以查看WatchService API。这已添加到Java 7中的SDK中。它允许注册在文件被更改时通知的事件监听器。
答案 3 :(得分:0)
这可以通过调用TableModel
的{{1}}方法来实现。我假设您的表由fireTableDataChanged
的实现支持。如果是这样,您只需在阅读文本文件的内容并更新表模型中的值后调用AbstractTableModel
。你可以在这里找到一些细节:
编辑:按照下面Dan的回复 - 您希望文本文件监控线程触发fireTableDataChanged
方法。
答案 4 :(得分:0)
我不能自动更新。我做的是,我只是关闭窗口再次调用相同的窗口。