закрытие окна в java swing

как закрыть окно через 60 секунд после бездействия пользователя ? Были мысли использовать многопоточность и цикл while() но как реализовать не совсем понимаю


Ответы (1 шт):

Автор решения: Дмитрий

В целом я вижу здесь несколько потенциально возможных решений. Для выбор оптимального из них у меня недостаточно исходных данных, поэтому предложу то, которое ан мой взгляд в данном случае будет наиболее применимое. Если вы никогда не слышали про слушатели, то самое время прочитать об этом. Итак, пишем довольно простой класс:

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

public class ActivityListener {

    private final int idleTimeSeconds;
    private final AtomicReference<LocalDateTime> lastClickAt;
    private final ScheduledExecutorService scheduler;

    private ActivityListener(int idleTimeSeconds) {
        this.scheduler = Executors.newSingleThreadScheduledExecutor();
        this.lastClickAt = new AtomicReference<>(LocalDateTime.now());
        this.idleTimeSeconds = idleTimeSeconds;
    }

    public static Runnable of(int idleTimeSeconds) {
        ActivityListener activityListener = new ActivityListener(idleTimeSeconds);
        activityListener.execute();
        return () -> activityListener.activate();
    }

    private void execute() {
        long delay = Duration.between(LocalDateTime.now(), lastClickAt.get().plusSeconds(idleTimeSeconds)).getSeconds();
        if (delay <= 0) System.exit(0);
        else scheduler.schedule(() -> execute(), delay, TimeUnit.SECONDS);
    }

    public void activate() {
        lastClickAt.set(LocalDateTime.now());
    }

}

При старте вашего приложения вы должны выполнить достаточно нехитрое действие:

Runnable runnable = ActivityListener.of(60);

В данном случае 60 - это описанные вами 60 секунд, таким образом, вы можете легко менять время "ожидания" до автоматического прекращения работы вашего приложения. Конструктор данного класса приватный, а инициализация выполняется статическим методом of(), что нарушает принцип единой ответственности SOLID, но не думаю, что в данном случае это станет проблемой.

Именно на этом этапе вам потребуется понимание, что такое слушатель. Именно слушатель "активности пользователя" вы и должны будете добавить в свое приложение, а при срабатывании этого слушателя вам необходимо вызывать метод runnable.run() у переменной типа Runnable , которую мы инициализировали выше.

Вот, собственно, и все...

→ Ссылка