2017-01-04 16 views
-1

このアプリケーションには2つのスレッドがあります。ここに表示されている方法は、マウスを動かすために4秒ごとに自動クリッカーメソッドを一時停止するメソッドを呼び出します。私はあなたがGUI停止ボタンをクリックすると、タイマーを停止したい。 今すぐ停止してからもう一度起動すると、コードを実行する2つのタイマーがあります。等々。Javaスイングタイマーを停止する方法

アクションリスナースタフ。

class MyButtonListener implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource().equals(view.getBtnStart())) 
     { 
      autoClick.unTerminate(); 
      bool = true; 
      getInfo(); 
     } 
     if (e.getSource().equals(view.getBtnExit())) 
     { 
      System.exit(0); 
     } 
     if (e.getSource().equals(view.getBtnStop())) 
     { 
      bool = false; 
      autoClick.terminate(); 
     } 
    }//end of actionPerformed 
}//end of inner class 

スレッド

Thread t2 = new Thread(new Runnable() { 
        @Override 
        public void run() { 
         Timer timer = new Timer(4000, new ActionListener() {//301000 5minutes and 1second 
          @Override 
          public void actionPerformed(ActionEvent evt) { 
           autoClick.timeOverload(); 
          }         
         }); 
         //if (!bool){timer.stop();} 
         timer.setRepeats(true); //false only repeates once 
         timer.start(); 
        } 
        });//end of t2 

それは繰り返しtimeOverloadメソッドを呼び出します。

お時間をいただきありがとうございました。

+0

タイマーをスレッド 'final'の外に構築して[' stop']できるようにすると(https://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html) #stop())彼は、これを行います。または、それが自分自身を '停止する '必要がある場合は'ブール値 'を使ってチェックすることができます – AxelH

+0

@AxelH私はあなたが意味すると思ったことを試しましたが、私はそれを行う正しい方法を見つけるように見えませんでした。あなたが気にしないなら、例は素晴らしいでしょう。 – Hades

+0

私はできますが、私はそれのために[mcve]が必要です。 GUIや 'autoClick'インスタンスはなく、スレッドとタイマーのみを使ってサンプルを提供できますか? – AxelH

答えて

0

ここでは、スレッドの外部にインスタンスを宣言し、インスタンス外でインスタンスを制御する方法の簡単なサンプルを示します。

public static void main(String[] args){ 
    final Timer timer = new Timer(500, new ActionListener() { 

     public void actionPerformed(ActionEvent e) { 
      System.out.println("tick"); 
     } 
    }); 
    timer.setRepeats(true); 

    Thread t = new Thread(new Runnable() { 

     public void run() { 
      timer.start(); 
     } 
    }); 
    t.start(); 

    try { 
     Thread.sleep(2600); 
    } catch (InterruptedException ex) { 
     ex.printStackTrace(); 
    } 

    timer.stop(); 
} 

Basiclyは、あなたが匿名クラス(のActionListenerの実装)で使用するインスタンスfinalを設定する必要があります。

ここでは、スレッドを開始してから数秒間プロセスを一時停止し、タイマーを停止します。

ここで、スレッドは何もしないので、直接終了します。あなたのニーズに合わせてこれを少しtweekする必要がありますが、実際の例があります。

EDIT:(DevilsHnd、あなたは、あなたの答えを投稿し、私を通知した場合、私はこの部分を削除します)

Main.stop()が設定されます呼び出す(ここではクラスで)

public class Main { 

    public static void main(String[] args){ 
     new Main(); 
    } 

    boolean running = true; 

    public Main(){ 
     final Timer timer = new Timer(500, new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       if(!running){ 
        ((Timer)e.getSource()).stop(); 
       } else { 
        System.out.println("tick"); 
       } 
      } 
     }); 
     timer.setRepeats(true); 
     timer.start(); 

     try { 
      Thread.sleep(2600); 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } 

     stop(); 
    } 

    public void stop(){ 
     running = false; 
    } 
} 

のフラグを使用フラグをfalseに設定すると、実行された各アクションでこのフラグがチェックされ、falseの場合はイベント(ソース内)からタイマーが取得され、停止します。

+0

申し訳ありませんが面倒ですが、私はそこに何があります。しかし、変数(bool)がfalseに切り替わったときにタイマーを停止したいとします。私はboolが真で、タイマーを止めないかどうかをテストするためにactionPerformedの中にSystem.out.printlnの周りにifを入れようとしていました。 – Hades

+0

@Hades、まあ、これは次回は、これはあなたの質問にはありません。しかし、私はこのソリューションを使用するための私の答えを編集しました。 – AxelH

関連する問題