Перезапустите таймер, если мышь движется - PullRequest
1 голос
/ 15 марта 2019

Я хочу перезапустить мою программу, если мышь не двигается в течение 2 минут.Я пытался установить таймер и перезапускать его каждый раз, когда мышь двигается, но пока ничего не получалось.Есть кто-то, кто может помочь мне с этой проблемой?

frame.addMouseMotionListener(new MouseAdapter() {
        public void mouseMoved(MouseEvent e) {
            timer.cancel();
            timer.purge();
            timer = new Timer();
            timer.schedule(new TimerTask() {
                public void run() {
                    frame.dispose();
                    try {
                        MyWeb neu = new MyWeb();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }, 5000);
        }
    });

Ответы [ 2 ]

3 голосов
/ 15 марта 2019

Таймер свинга

Вы хотите использовать таймер качания (javax.swing.Timer) вместо обычного таймера (java.util.Timer). См. Oracle Tutorial .

Автоматическая заправка

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

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

TimerTask, чтобы закрыть приложение

Напишите свою работу, которая будет выполняться при срабатывании таймера, как java.util.TimerTask.

Алгоритм

Таймер Swing может срабатывать один или несколько раз. Вы хотите стрелять один раз. После запуска закройте ваше приложение.

Установите таймер при запуске вашего приложения. Сохраните ссылку на этот таймер в вашем приложении. Настройте таймер для желаемого 2-минутного обратного отсчета. Каждый раз, когда мышь двигается, вызовите restart на таймере качания. Таким образом, 2-минутный отсчет продолжает возвращаться к 2 минутам. Ваше приложение может работать часами, а 2-минутный таймер сбрасывается снова и снова.

launch timer (2 mins) →  on mouse move  ↓ → timer fires → shutdown app
                      ↑ ← restart timer ←

Завершение работы или перезапуск

Когда отсчет истекает, я не уверен, что вы намеревались завершить работу, перезапустить или просто повторно инициализировать какое-то состояние в вашем приложении. Если последний (состояние повторной инициализации), установите таймер на срабатывание несколько раз, а не один раз. Остальная часть подхода остается прежней.

Возможна оптимизация

Не знаю наверняка, но я подозреваю, что сброс таймера на при каждом перемещении мыши может быть излишним и может стоить немного производительности. Профиль, чтобы увидеть для себя. Если это кажется значительным, просто отследите последний раз, когда вы сбрасывали таймер. Чтобы отследить этот момент, используйте объект Instant. Звоните Instant.now(), чтобы зафиксировать текущий момент при каждом движении мыши. Рассчитайте прошедшее время с помощью Duration.between. Когда продолжительность превышает произвольный предел, скажем, 5 секунд, перезапустите таймер Swing и обновите «когда последний раз таймер перезапустился» Instant, который вы храните. Instant.now фиксирует текущий момент с разрешением миллисекунды в Java 8 и разрешением микросекунды в Java 9 и более поздних версиях. (Instant на самом деле содержит наносекунд , но обычные компьютерные часы не могут работать так хорошо.)

0 голосов
/ 15 марта 2019

Вот мое решение до сих пор: Вы можете создать собственный Thread, который спит в течение 2 секунд. Если это время истекло, вы можете делать все, что захотите. Если мышь перемещается, вы можете interrupt the Thread и повторить:

public class MyMouseMotionListener implements MouseMotionListener {

    private final Thread timerThread;

    public MyMouseMotionListener() {
        this.timerThread = new Thread(new SleeperThread());
        this.timerThread.start();
    }

    @Override
    public void mouseDragged(MouseEvent e) {}

    @Override
    public void mouseMoved(MouseEvent e) {
        this.timerThread.interrupt();
    }
}

И Нить:

public class SleeperThread implements Runnable {

    @Override
    public void run() {
        while(true) {
            try{
                Thread.sleep(2000);
                System.out.println("Do Whatever you want.");
            } catch(InterruptedException ex) {
                System.out.println("Do nothing yet.");
            }
        }
    }

}
...