java - 试图阻止 Swing worker

标签 java multithreading swing swingworker

我有一个自定义 JDialog,当我的 SwingWorker 线程启动时,它会弹出。该对话框只有一个 JProgressbar 和一个 Button(取消按钮)。我正在尝试弄清楚如何取消我的 SwingWorker,但运气不佳。但我认为我走在正确的道路上。我编写了一个取消方法,现在我只需要弄清楚按下按钮时如何调用它。代码如下...

            btn_Cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) 
                {
                   //trying to access cancel()
                }
             });

        SwingWorker worker = new SwingWorker<String, Void>() { 
        @Override
        protected String doInBackground() throws Exception {
                while (runLoad.getState() != Thread.State.TERMINATED &&      !isCancelled()) {
                    try {
                        synchronized (this) {
                            Thread.sleep(2000);
                        }
                    } catch (InterruptedException e){}
                }
                return null;
            }
        @Override
        public void done() {
                try {
                   get(); 
                } catch (InterruptedException | ExecutionException ex) {
                    JOptionPane.showMessageDialog(null,
                    "Somethings Wrong: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                }
              Progress.setVisible(false);
              Progress.dispose();
            }
        public void cancel(SwingWorker worker){
            worker.cancel(true);
         }
       };
       worker.execute();

最佳答案

您的取消按钮应调用 SwingWorker#cancel 方法

final SwingWorker worker = ...;

btn_Cancel.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
    worker.cancel( true );
  }
});

在你的工作线程中,你必须确保检查取消标志

SwingWorker worker = new SwingWorker<String, Void>() { 
  @Override
  protected String doInBackground() throws Exception {
    while ( !isCancelled() ) {
      //do your stuff
    }
  }
}

请注意,您需要在创建 ActionListener 之前创建工作线程

关于java - 试图阻止 Swing worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20427697/

相关文章:

java - 用定时器绘图不工作

java - Jpanel UI main() 方法

java - MS SQL Server 2005 Express x86 - 其端口无法访问 - 帮助

java - Webservice——客户端服务实例化

java - 将整数表示为方差最小的整数之和

java - Thread Pool实现代码中的疑问

java - 每个应用程序一个(较大)线程池与每个应用程序组件多个(较小)线程池

java - 炸弹人游戏中的炸弹爆炸

Java 多线程 - 从列表中删除项目

java - 占绘图面板一定百分比的绘图矩形