Java 将swingWorker与其他类一起使用
我开始使用Java GUI,但SwingWorker有一些问题:我尝试使用一个简单的UI来启动服务器,运行一些“从属”对象,最后运行一个主对象来管理所有工作。我在master中定义了问题(要做的任务数量),并且在UI中有一个progressBar,我希望在每次任务完成时更新它。我使用SwingWorker来更新progressBar,但我不知道如何正确操作:在background方法中,它只是休眠,直到任务完成后主程序将其唤醒。不幸的是,它不起作用,如果有人能解释我该怎么做,我将不胜感激 我在GUI中创建swingworker,并为更新进度条添加一个侦听器:Java 将swingWorker与其他类一起使用,java,swing,swingworker,jprogressbar,Java,Swing,Swingworker,Jprogressbar,我开始使用Java GUI,但SwingWorker有一些问题:我尝试使用一个简单的UI来启动服务器,运行一些“从属”对象,最后运行一个主对象来管理所有工作。我在master中定义了问题(要做的任务数量),并且在UI中有一个progressBar,我希望在每次任务完成时更新它。我使用SwingWorker来更新progressBar,但我不知道如何正确操作:在background方法中,它只是休眠,直到任务完成后主程序将其唤醒。不幸的是,它不起作用,如果有人能解释我该怎么做,我将不胜感激 我在G
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
worker = WorkerUpdater.getInstance();
jProgressBar1.setValue(0);
worker.addPropertyChangeListener(this);
worker.execute();
这是SwingWorker:
public class WorkerUpdater extends SwingWorker<Void, Integer> {
private static WorkerUpdater instance;
private int progress;
private boolean changed = false;
public int getProgreso(){
return this.progress;
}
public void setProgreso(int p){
this.progress = p;
changed = true;
}
public static WorkerUpdater getInstance(){
if(instance == null)
instance = new WorkerUpdater();
return instance;
}
@Override
protected Void doInBackground() throws Exception {
while(progress < 100){
if(changed){
setProgress(Math.min(progress, 100));
changed = false;
}
}
return null;
}
}
问题是,客户端类中的进度值会更改其值,但进度条不会更改。如果您发布了一个SSCCE,说明您遇到了什么样的问题,这会很有帮助。进度条不会自动更新。您必须对其调用
setValue
。除了设置为0之外,我看不到您正在这样做。此外,您的代码不是线程安全的。特别是,HotSpot可能能够将if(changed)
编译为if(false)
,因为changed
不是易失性的。我忘了输入方法,但我有一个“propertyChange”,它不起作用。
public boolean taskIsDone(String taskID, Object[] retVal) throws RemoteException {
System.out.println("Client: taskIsDone(): Old task: " + taskID);
this.doneTasks++;
this.progress = ((Double) Math.ceil(doneTasks / totalTasks)).intValue();
synchronized (taskSynch) {
worker.setProgress(progress);
this.results.put(taskID, retVal);
task_count--;
taskSynch.notify();
}
System.out.println("Client: Task finished: " + taskID);
return true;
}