0

我有一个连接远程服务器上的读取文件的应用程序。文件动态更新,这就是我使用 Timer 类定期重新读取此文件的原因。工作流程如下:

  • 打开将显示文本的窗口。

  • 开始读取文件(使用定时器每 15 秒重读一次)

  • 在 15 秒内,窗口充满了数据,或者我在日志中收到异常。异常被抑制,我继续尝试读取数据。

例外是我的问题,因为用户不知道应用程序现在发生了什么。我运行了至少两个异常: - 如果文件不存在,我收到 FileNotFoundException。- 如果服务器处于维护状态,我会收到其他异常(我抓住了它,所以它的名字无关紧要)。

以下是上面代码中的样子:

public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
            final RemoteReader reader = new RemoteReader();
            Timer timer = new Timer(15000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        reader.getMainPanel().readData();
                    } catch (IOException e) {
            //Here is a counter that increases after each exception throw
            if(counter >5) {
                JOptionPane.showOptionDialog(chat,
                    e.getMessage(),
                    e.getClass().getName(),
                    JOptionPane.OK_CANCEL_OPTION,
                    JOptionPane.INFORMATION_MESSAGE,
                    null,
                    new String[]{"Retry", "Cancel"}, //on Retry - make another 5 tries to read file, on cancel - close the window
                    null);
                counter = 0;
            }
                        e.printStackTrace();
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                }
            });
            timer.start();
            }
        });
    }

    public String readData() throws IOException {
    // read and process data before returning it
    // but for test purpose:
        //BufferedReader br = new BufferedReader(new InputStreamReader(this.url.openStream()));
    throw new IOException("cannot read file");
     }

我想要做的是添加 JProgressBar。打开主窗口时会出现进度条,然后读取数据。如果 IOException 连续抛出 5 次,则显示选项对话框。否则隐藏进度条并显示数据。如果远程文件不可用,则显示选项对话框。然后按下重试按钮,显示进度条......然后工作流程从头开始。

一些代码示例会对我有所帮助,但我不希望整个问题的解决方案 - 建议,从设计的角度来看应该如何以正确的方式完成就足够了。Oracle 的样本对我来说有点模糊。

4

1 回答 1

1

即使WatchService, seen here不可用,我仍然会使用SwingWorker, seen herehere

  • 你有相当大的自由度来调整doInBackground()线程,例如Thread.sleep(15 * 1000)

  • 您可以setProgress()在后台监听PropertyChangeEventGUI 中的任何内容。

  • 您可以更新在EDTprocess()上运行的任何 GUI 组件。

于 2013-03-18T17:22:25.693 回答