自动更新JTable

时间:2012-09-27 06:21:34

标签: java eclipse swing java-ee jtable

我正在从.txt文件创建一个Jtable。 .txt文件在一段时间内不断更新。我需要知道是否有任何方法可以在我的Jtable AT RUN-TIME中反映.txt文件中的这些更改!我知道重新启动时,表读取.txt文件,但有没有办法在运行时执行?

5 个答案:

答案 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。你可以在这里找到一些细节:

Java API

编辑:按照下面Dan的回复 - 您希望文本文件监控线程触发fireTableDataChanged方法。

答案 4 :(得分:0)

我不能自动更新。我做的是,我只是关闭窗口再次调用相同的窗口。