Java 暂停Swingworker

Java 暂停Swingworker,java,swing,swingworker,Java,Swing,Swingworker,我有一个GUI,它有一个按钮,需要周期性地按下,在这两个按钮之间应该暂停。但我无法做到这一点。我试过Thread.sleep()。下面是代码 protected Object doInBackground() throws Exception { while(true){ btnSend.doClick(); try { Thread.sleep(2000);

我有一个GUI,它有一个按钮,需要周期性地按下,在这两个按钮之间应该暂停。但我无法做到这一点。我试过Thread.sleep()。下面是代码

protected Object doInBackground() throws Exception {

            while(true){
                 btnSend.doClick();
                  try { 
                    Thread.sleep(2000);
                    continue;
                } catch (InterruptedException e1) {

                }
              }

    return null;
}

有人能告诉我哪里出了问题以及如何解决吗?

您不应该为此使用SwingWorker,因为您不应该在事件线程下调用
doClick()
。如果您想要做的只是间歇性地进行此调用,那么只需在事件线程上为需要间歇性地进行的调用使用Swing计时器即可


编辑
你在评论中问:


但我需要在按钮点击事件上更新另一个UI。如果我不使用swingworker,其他UI将冻结。我必须使用swingworker。有可能吗

恐怕你弄错了。按钮点击和GUI代码都应该在EDT上。由按钮单击的ActionListener生成的任何后台非GUI代码都应该在SwingWorker中完成,而不是单击本身

e、 g

别处

btnSend.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
    new SwingWorker<Void, Void>() {
      public Void doInBackground() throws Exception {
        //.....
        return null;
      }
    }
  }
});
btnSend.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件evt){
新SwingWorker(){
public Void doInBackground()引发异常{
//.....
返回null;
}
}
}
});

如果你需要对你的情况提出更具体的建议,那么你就要考虑创建和发布一个你把代码浓缩到最小的位,它仍然编译和运行,没有外部依赖关系(比如需要链接到一个数据库或图像),没有额外的与你的问题不相关的代码。但是仍然显示了您的问题。

您不应该为此使用SwingWorker,因为您不应该在事件线程下调用
doClick()
。如果您想要做的只是间歇性地进行此调用,那么只需在事件线程上为需要间歇性地进行的调用使用Swing计时器即可


编辑
你在评论中问:


但我需要在按钮点击事件上更新另一个UI。如果我不使用swingworker,其他UI将冻结。我必须使用swingworker。有可能吗

恐怕你弄错了。按钮点击和GUI代码都应该在EDT上。由按钮单击的ActionListener生成的任何后台非GUI代码都应该在SwingWorker中完成,而不是单击本身

e、 g

别处

btnSend.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
    new SwingWorker<Void, Void>() {
      public Void doInBackground() throws Exception {
        //.....
        return null;
      }
    }
  }
});
btnSend.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件evt){
新SwingWorker(){
public Void doInBackground()引发异常{
//.....
返回null;
}
}
}
});

如果你需要对你的情况提出更具体的建议,那么你就要考虑创建和发布一个你把代码浓缩到最小的位,它仍然编译和运行,没有外部依赖关系(比如需要链接到一个数据库或图像),没有额外的与你的问题不相关的代码。但仍然说明了你的问题。

“如何解决”什么?你写的东西怎么了?@drewmoore啊……很抱歉漏掉了……事实上,每两秒钟点击一次按钮都不会发生。它只在第一次发生时停止。是否引发
中断异常
?你不知道,因为你有一个空的捕捉区。至少,在那里放一个
println()
语句,让您知道发生了什么。在
try
块内放置另一个,在
while
块后放置另一个,您可以看到发生了什么。你就是这样想出来的。所有这些都是一般性的建议。在这个具体案例中,请参阅@Hovercraft的答案“如何解决”什么?你写的东西怎么了?@drewmoore啊……很抱歉漏掉了……事实上,每两秒钟点击一次按钮都不会发生。它只在第一次发生时停止。是否引发
中断异常
?你不知道,因为你有一个空的捕捉区。至少,在那里放一个
println()
语句,让您知道发生了什么。在
try
块内放置另一个,在
while
块后放置另一个,您可以看到发生了什么。你就是这样想出来的。所有这些都是一般性的建议。在这个特定的例子中,请参阅@Hovercraft的回答,但我需要更新该按钮单击事件的另一个UI。如果我不使用swingworker,其他UI将冻结。我必须使用swingworker。有可能吗?@Soujanya:请看编辑到编辑。另外,我看到您已经在对的评论中收到了建议。这是一个很好的推荐,一个强烈要求你仔细考虑一下。但是我需要在按钮点击事件上更新另一个UI。如果我不使用swingworker,其他UI将冻结。我必须使用swingworker。有可能吗?@Soujanya:请看编辑到编辑。另外,我看到您已经在对的评论中收到了建议。这是一个很好的建议,一个强烈要求你仔细考虑。