我有一个GUI,它有一个需要定期按下的按钮,它应该在两者之间暂停。但我无法做到这一点。我尝试过Thread.sleep()。以下是代码。
protected Object doInBackground() throws Exception {
while(true){
btnSend.doClick();
try {
Thread.sleep(2000);
continue;
} catch (InterruptedException e1) {
}
}
return null;
}
谁能告诉我哪里出错了以及如何解决?
答案 0 :(得分:4)
您不应该使用SwingWorker,因为您不应该从事件线程中调用doClick()
。如果您要做的是间歇性地进行此调用,则只需使用Swing Timer进行间歇性调用,并在事件线程上进行。
int timerDelay = 2000;
new Timer(timerDelay, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btnSend.doClick();
}
}).start();
修改强>
你在评论中提问:
但是我需要在该按钮点击事件上更新另一个UI。如果我不使用swingworker,其他UI将冻结。我必须使用swingworker。是否可以这样做?
我担心你错了。按钮单击和GUI代码都应该在EDT上。按钮单击的ActionListener生成的任何后台非GUI代码都应该在SwingWorker中完成,而不是单击本身。
如,
别处
btnSend.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
new SwingWorker<Void, Void>() {
public Void doInBackground() throws Exception {
//.....
return null;
}
}
}
});
如果您需要有关您情况的更具体的建议,那么您将需要考虑创建并发布Minimal, Complete, and Verifiable Example Program,其中您将代码压缩到仍然编译和运行的最小位,没有外部依赖(例如因为需要链接到一个或多个数据库),没有额外的代码与您的问题无关,但仍然可以证明您的问题。