暂停Swingworker

时间:2014-07-10 01:32:18

标签: java swing swingworker

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

protected Object doInBackground() throws Exception {

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

                }
              }

    return null;
}

谁能告诉我哪里出错了以及如何解决?

1 个答案:

答案 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,其中您将代码压缩到仍然编译和运行的最小位,没有外部依赖(例如因为需要链接到一个或多个数据库),没有额外的代码与您的问题无关,但仍然可以证明您的问题。