2016-04-20 16 views
1

私はJAVAを初めて使い慣れていますが、適切なタイミングで見えて消えるようにする適切な方法を見つけるようです。基本的には、コードをトリガーするボタンがあります。このコードは、実行に数分かかる場合があります。この間、私はアニメーションの砂時計ガラスを表示し、終了時に消滅させたいと考えています。Jlabelはクリック直後に表示され、コードがJavaで実行された後に消えます。Javaのローダーのように、クリック操作後のイベントシーケンス

基本的に、砂時計のガラスはジュラベルの内側にあり、最初は目に見えないように設定されています。 アクションイベントでJbuttonをクリックしたときに、最初に表示するように設定すると、50個のifステートメントとcmdに書き込んで出力を取得するいくつかの関数のようになります。それが終わったら、もう一度目に見えないように書きます。唯一の問題は、コードの進捗状況がプログレスローダーとして使用するという全目的を破って終了した後にのみ表示されることです。誰もこの効果を達成する方法を知っていますか?ここで コードです:

//The JLabel 
    JLabel lblLoading = new JLabel("Loading"); 
    lblLoading.setIcon(new ImageIcon("hourglass.gif")); 
    lblLoading.setBounds(407, 274, 132, 74); 
    lblLoading.setVisible(false); 
    // The Button Code 
    btnCheckUpdates.setIcon(new ImageIcon("image/checkicon.png")); 
    btnCheckUpdates.setBounds(216, 361, 148, 34); 
    frame.getContentPane().add(btnCheckUpdates); 
    // the action event on click 
    btnCheckUpdates.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
     //I set visible to true in the begening 
     lblLoading.setVisible(true); 
     // Here goes like 50 if statements 
     // call to function which writes to cmd.exe then returns info 
     // info is checked (like another 50 if statements) 
     // call to cmd function again 
     // Now after all the code is written i try to make it invisible again 
     lblLoading.setVisible(false); 
     } 
    }); 

私はおそらくすべてで何かがどのように機能するかを理解していないよ確信しています。なぜこれが起こっているのか、それを正しく動作させる方法や、それが動作しているように見せかけるためのシンプルなトリックを使うのは誰にも分かりませんか? どんな助力も大変ありがとうございます!

答えて

1

このようにすると、メインスレッド上のすべての作業を行っているため、更新の作業が完了するまでGUIがフリーズします。 Swingでプログレスバーを作成する場合は、SwingWorkerを使用しているため、Swingコンポーネントを安全に更新しながらバックグラウンドロジックを実行できます。

private JLabel lblLoading; 
    private UpdateTask task; 

    ... 
     lblLoading = new JLabel("Loading"); 
     lblLoading.setIcon(new ImageIcon("hourglass.gif")); 
     lblLoading.setBounds(407, 274, 132, 74); 
     lblLoading.setVisible(false); 
     // The Button Code 
     btnCheckUpdates.setIcon(new ImageIcon("image/checkicon.png")); 
     btnCheckUpdates.setBounds(216, 361, 148, 34); 
     frame.getContentPane().add(btnCheckUpdates); 
     // the action event on click 
     btnCheckUpdates.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       task = new UpdateTask().execute(); 
      } 
     }); 
    } 

    private class UpdateTask extends SwingWorker<Void,Void> { 

     @Override 
     protected Void doInBackground() throws Exception { 
      lblLoading.setVisible(true); 

      // Initialize progress 
      setProgress(0); 

      // Background logic goes here 

      // Progress can be updated as necessary 
      setProgress(50); 

      setProgress(100); 

      return null; 
     } 

     @Override 
     protected void done() { 
      lblLoading.setVisible(false); 
     } 
    } 

Oracleのウェブサイト上で見つけることができる完全に機能ProgressBarDemoもあります:あなたのケースでは、次のようになります。

+0

ありがとうございました。試してみます... – Alex

関連する問題