运行 美国东部时间延迟后

Run on EDT after delay

我想在指定的超时后关闭对话框。到目前为止,我有以下方法:

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 上调用 运行 代码的方法。这可能吗?

不是真的。如果你切换到使用(更现代的)java.util.concurrent 做事方式,你可以使用两个 lambda 并像这样做:

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() 的结果以供将来调用。)