这是我第一次尝试将Swing组件用于GUI,我试图实现一个允许用户运行2个异步远程命令的解决方案。
简而言之,这两个命令是:
我的问题是虽然我使用了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;
}