SwingWorker扩展但GUI仍然冻结

时间:2016-03-29 17:58:50

标签: java swing user-interface worker

这是我第一次尝试将Swing组件用于GUI,我试图实现一个允许用户运行2个异步远程命令的解决方案。

简而言之,这两个命令是:

  1. 在远程服务器上执行命令
  2. 下载数据
  3. 我的问题是虽然我使用了SwingWorker,但我的主菜单仍然冻结。此外,传递SwingWorker并在添加第一个命令之前执行第二个命令。

    我在网上经历过很多很多例子和解释,我觉得我仍然缺少一些让我能够做到这一点的关键直觉。

    我的摇摆工作者有什么问题,因为它仍然会冻结GUI并且在完成之后不会等待其余的代码?

    编辑:最后我还要创建一个进度条,显示完成前任务中剩余的时间。

    GUI类 - 带按钮的基本GUI

    public TestGUI(){
          //code to show Gui with buttons
    
          //code also contains mouse listener:  
         btn.addMouseListener(new MouseAdapter() { // listener
            @Override
            public void mousePressed(MouseEvent e){
                SampleClass.doRemoteTask();
            }
    
        });   
    
    }
    

    示例类 - 在后台使用Swing Worker运行远程命令

     public SampleClass(){
    
     public static void doRemoteTask(){
        //create sample worker
        final SampleWorker sampleworker = new SampleWorker(command, session); 
    
        //add change listener to wait for state change.
        sampleworker.addPropertyChangeListener(new PropertyChangeListener(){
            @Override
            public void propertyChange(PropertyChangeEvent event) {
                if(StateValue.DONE == sampleworker.getState()){
                    try {
                        Integer i = sampleworker.get();
                    } catch (InterruptedException | ExecutionException e) {
                        System.out.println("Could not get");
                        e.printStackTrace();
                    }
                };
            }
        });
    
      //do other stuff after the state DONE
      sampleworker.execute(); //sample worker is a long task. This is why it was created in the Swing Worker. 
       }
    
    }
    

    示例工作者类 - 在后台运行命令

    protected Integer doInBackground() throws Exception {
        byte[] tmp=new byte[1024];
        int j = 0;
        publish("Start");
        while(true){
                //do stuff
                if(j % 100 == 0){
                    setProgress(j);
    
            }
                //write to System.out then exit
                break;
            }
            try{Thread.sleep(1000);}catch(Exception ee){}
        }
        publish("Completed");
    
        return j;
    }
    

0 个答案:

没有答案