2016-09-25 6 views
0

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

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

メインフレームクラスで
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がメインスレッドで実装されるべきだと読んでいます。バックグラウンドスレッドの作業が完了し、インジケータラベルを可視に設定する必要があるという私のケースでメインスレッドにどのように通知しますか?

ありがとうございます!

答えて

1

私はアクティビティインジケータについてよく分かりませんが、同期が不足しているようです。

あなたはlblActivityIndicatorの内側に何を制御することができない場合、これはトリックを行う必要があります。

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); 
    } 
} 
関連する問題