0

リモートサーバー上の読み取りファイルに接続するアプリがあります。ファイルは動的に更新されるため、Timer クラスを使用してこのファイルを定期的に再読み込みします。ワークフローは次のとおりです。

  • テキストを表示するウィンドウを開きます。

  • ファイルの読み取りを開始 (タイマーを使用して 15 秒に 1 回再読み取り)

  • 15 秒でウィンドウがデータでいっぱいになるか、ログに例外が表示されます。例外は抑制され、データの読み取りを続行します。

ユーザーはアプリで現在何が起こっているのかわからないため、例外は私の問題です。私が実行した例外は少なくとも 2 つあります。 - ファイルが存在しない場合、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 回連続でスローされた場合、オプション ダイアログを表示します。それ以外の場合は、進行状況バーを非表示にしてデータを表示します。リモート ファイルが利用できなくなった場合、オプション ダイアログを表示します。再試行ボタンを押すと、プログレス バーが表示され、ワー​​クフローが最初から開始されます。

いくつかのコード例が役立ちますが、問題全体の解決策は期待していません-アドバイス、設計の観点から正しい方法で行う方法で十分です。オラクルのサンプルは、私には少しあいまいです。

4

1 に答える 1

1

WatchService, see here が利用できない場合でも、私はまだ, seen herehereを使用しますSwingWorker

  • doInBackground()スレッドのペーシングにはかなりの自由度がありますThread.sleep(15 * 1000)

  • バックグラウンドで、GUI でsetProgress()リッスンできます。PropertyChangeEvent

  • EDTprocess()で実行される の任意の GUI コンポーネントを更新できます。

于 2013-03-18T17:22:25.693 に答える