Запустите на EDT после задержки - PullRequest
0 голосов
/ 31 января 2019

Я хочу закрыть диалог по истечении указанного времени ожидания.Пока у меня есть следующий метод:

public static void addTimeout(final Component c, long timeout) {
    Timer t = new Timer(c.getName() + "-TimeoutTimer");
    t.schedule(new TimerTask() {
        @Override
        public void run() {
            if (c.isVisible()) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        c.setVisible(false);
                    }
                });
            }
        }
    }, timeout);
}

Однако я хотел бы знать, есть ли более компактный способ написать это.Например, избегая установки таймера и просто вызывая метод для выполнения кода в EDT с указанной задержкой.Это возможно?

1 Ответ

0 голосов
/ 31 января 2019

Не совсем.Если вы переключитесь на использование (более современного) java.util.concurrent способа ведения дел, вы можете использовать две лямбды и сделать это так:

public static void addTimeout(final Component c, long timeout) {
    Executors.newSingleThreadScheduledExecutor().schedule(() -> {
        if (c.isVisible()) {
            SwingUtilities.invokeLater(() -> {
                c.setVisible(false);
            });
        }
        return null;
    }, timeout, TimeUnit.MILLISECONDS);
}

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

(Примечание: если вы на самом деле используете приведенный выше код, вероятно, было бы лучше сохранить результат Executors.newSingleThreadScheduledExecutor() для будущих вызовов.)

...