我想在指定的超时后关闭对话框。到目前为止,我有以下方法:
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上运行代码。有可能吗?
答案 0 :(得分:1)
不是。如果您转而使用(更现代的)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()
的结果存储起来以备将来调用。)