2017-01-04 8 views
-1

Это приложение имеет 2 потока, показанный здесь, метод, который автоматически останавливает метод автоматического кликера каждые 4 секунды (просто для облегчения), чтобы сделать движение мыши. Я хочу, чтобы он остановил таймер, когда вы нажимаете кнопку остановки gui. Прямо сейчас, когда вы нажимаете стоп и затем начинаете снова, у него есть два таймера, которые будут выполнять код; и так далее.Как остановить таймер качания 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

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()), это сделает это. Или вы можете использовать 'boolean', чтобы проверять каждый тик, если он должен сам' stop' – AxelH

+0

@AxelH Я пробовал то, что я думал, вы имели в виду, но я, похоже, не нашел правильного пути для этого. Если бы вы не возражали, пример был бы замечательным. – Hades

+0

Я мог бы, но для этого мне нужен [mcve]. Не могли бы вы привести пример, используя только Thread и Timer, не 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(); 
} 

Основном, вам необходимо установить экземпляр final, который будет использоваться в анонимном классе (реализации ActionListener).

Здесь я только начинаю тему, а затем приостанавливаю процесс на несколько секунд и останавливаю таймер.

Обратите внимание, что здесь нить ничего не делает, поэтому она заканчивается напрямую. Вам нужно немного подкрутить это, чтобы соответствовать вашим потребностям, но у вас есть рабочий пример.

EDIT: (DevilsHnd, если вы разместите свой ответ, сообщите мне, я удалю эту часть)

Использование флага (здесь, в одном классе)

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; 
    } 
} 

Вызов Main.stop() установит flag to false, при каждом выполненном действии вы проверяете этот флаг, если он ложный, вы получаете таймер из события (в источнике) и останавливаете его.

+0

Извините за хлопот, но у меня есть то, что там. Но скажу, что я хочу остановить таймер, когда переменная (bool) переключится на false. Я пытался установить if вокруг System.out.println внутри actionPerformed, чтобы проверить, было ли bool истинным и если не остановить таймер. – Hades

+0

@ Хэдс, ну, точно это в следующий раз, это не в твоем вопросе. Но я отредактировал свой ответ, чтобы использовать это решение. – AxelH