MVC进度条线程
我正在为我的设计使用MVC模式,当用户按下搜索按钮时,我在模型中调用搜索,但我还想更新从该模型返回的信息的进度条。
我尝试过使用swingworker,但进度条没有更新。我怀疑我的线程出错了。
我在控制器中定义的按钮是:
class SearchBtnListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
_view.displayProgress();
}
}
这将调用模型中的搜索,并在视图中进行以下调用:
public void displayProgress() {
TwoWorker task = new TwoWorker();
task.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
if ("progress".equals(e.getPropertyName())) {
_progressBar.setValue((Integer) e.getNewValue());
}
}
});
task.execute();
}
private class TwoWorker extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() throws Exception {
_model.startSearch(getTerm()); // time intensive code
File file = new File("lock");
while (file.exists()){
setProgress(_model.getStatus());
System.out.println(_model.getStatus()); // never called
}
return null;
}
protected void done(){
updateMain();
}
}
模型中定义的虚拟函数用于测试:
public int getStatus(){
Random r = new Random();
return r.nextInt();
}
没有找到相关结果
已邀请:
1 个回复
蓟类
从你的SwingWorker中,因为这是从后台线程调用Swing代码,无论如何都是PropertyChangeListener。相反,只需设置进度属性即可。 另外,不要在doInBackground方法中调用done(),因为这需要由SwingWorker从EDT调用。因此,当实际完成时,让SwingWorker本身调用此方法。 此外,Done()应该完成() - 第一个字母不应该大写,你应该在这段代码中使用@Override注释,这样你就可以确定你正确地覆盖了方法。 另外,这是做什么的?
它是否需要花费一段时间来完成代码?这应该从SwingWorker doInBackground本身初始化吗? 编辑: 另一种选择是给Model一个绑定的int属性,比如称为progress,然后直接添加一个PropertyChangeListener让它更新JProgressBar。例如,