0

フレーム クラス MainFrame と JPanel を拡張するクラス PanelPlan を持つスイング GUI アプリケーションがあります。BufferedReader を使用してテキスト ファイルを 1 行ずつ読み取り、その他の計算を行うことで、テキスト ファイルを操作します。バックグラウンド スレッドで実行されます。また、メインフレームに gif アクティビティ インジケーターを含むラベルを作成しました。だから、私がやろうとしているのは、ユーザーにボタンをクリックさせ、アプリケーションがバックグラウンドでファイルを読み取り、実行中に回転インジケーターが表示される (または「回転を開始する」) ことです。ファイルが読み取られると、アプリケーションは特定のパラメーターを更新し、アクティビティ インジケーターが非表示になります (「回転が停止します」)。

これは私が持っているものです:

private void btnAddDepActionPerformed(java.awt.event.ActionEvent evt) {                                          

  MainFrame mainFrame = new MainFrame();
  mainFrame.setIndicatorVisible(); // Activity indicator starts spinning

  new Thread(() -> 
  {
    //... code to read a text file and perform other operations;

    // Activity indicator stops spinning
    mainFrame.setIndicatorInvisible();

  }).start();
}

メインフレーム クラス:

public MainFrame() {
        /* Initialize GUI components */
        initComponents();

        setIndicatorInvisible();
    }

public void setIndicatorVisible()
    {
        System.out.println("\n\nCHECK ACTIVITY INDICATOR ON\n\n");
        lblActivityIndicator.setVisible(true);
    }


    public void setIndicatorInvisible()
    {
        System.out.println("\n\nCHECK ACTIVITY INDICATOR OFF\n\n");
        lblActivityIndicator.setVisible(false);
    }

println 情報は期待どおりにコンソールに表示されますが、アクティビティ インジケータは表示されません。常に表示されるようにすると、インジケーターが回転しているため、適切に設定されていることがわかります (ただし、ファイルが読み取られたときに回転が停止することはありません)。

これが私が使用する正しいアプローチであるかどうか疑問に思います。GUIはメインスレッドに実装する必要があると読みました。私の場合、バックグラウンド スレッドでの作業が完了し、インジケーター ラベルが表示されるように設定する必要があることをメイン スレッドに通知するにはどうすればよいですか?

どうもありがとう!

4

1 に答える 1

1

I don't know much about the activity indicator, but it looks like a lack of synchronization.

If you can't control what's inside the lblActivityIndicator then this should do the trick:

public void setIndicatorVisible() {
    System.out.println("\n\nCHECK ACTIVITY INDICATOR ON\n\n");
    synchronized(lblActivityIndicator) {
         lblActivityIndicator.setVisible(true);
    }
}


public void setIndicatorInvisible() {
    System.out.println("\n\nCHECK ACTIVITY INDICATOR OFF\n\n");
    synchronized(lblActivityIndicator) {
        lblActivityIndicator.setVisible(false);
    }
}
于 2016-09-28T12:03:35.910 に答える