закрытие окна в 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 , которую мы инициализировали выше.
Вот, собственно, и все...