java 线程 进度条_java – MVC进度条线程

不要打电话

_progressBar.setValue(_model.getStatus());

从你的SwingWorker中,因为这是从后台线程调用Swing代码,无论如何都是PropertyChangeListener.相反,只需设置进度属性即可.

另外,不要在doInBackground方法中调用done(),因为这需要由SwingWorker从EDT调用.因此,当实际完成时,让SwingWorker本身调用此方法.

此外,Done()应该完成() – 第一个字母不应该大写,你应该在这段代码中使用@Override注释,这样你就可以确定你正确地覆盖了方法.

另外,这是做什么的?

_model.startSearch(_view.getTerm());

它是否需要花费一段时间来完成代码?这应该从SwingWorker doInBackground本身初始化吗?

编辑:

另一种选择是给Model一个绑定的int属性,比如称为progress,然后直接添加一个PropertyChangeListener让它更新JProgressBar.例如,

import java.awt.BorderLayout;

import java.awt.event.*;

import java.beans.PropertyChangeEvent;

import java.beans.PropertyChangeListener;

import java.beans.PropertyChangeSupport;

import javax.swing.*;

public class MVC_ProgressBarThread {

private static void createAndShowUI() {

MVC_View view = new MVC_View();

MVC_Model model = new MVC_Model();

MVC_Control control = new MVC_Control(view, model);

view.setControl(control);

JFrame frame = new JFrame("MVC_ProgressBarThread");

frame.getContentPane().add(view);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

public static void main(String[] args) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

createAndShowUI();

}

});

}

}

@SuppressWarnings("serial")

class MVC_View extends JPanel {

private MVC_Control control;

private JProgressBar progressBar = new JProgressBar();

private JButton startActionButton = new JButton("Start Action");

public MVC_View() {

startActionButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

buttonActionPerformed();

}

});

JPanel buttonPanel = new JPanel();

buttonPanel.add(startActionButton);

setLayout(new BorderLayout());

add(buttonPanel, BorderLayout.NORTH);

add(progressBar, BorderLayout.CENTER);

}

public void setControl(MVC_Control control) {

this.control = control;

}

private void buttonActionPerformed() {

if (control != null) {

control.doButtonAction();

}

}

public void setProgress(int progress) {

progressBar.setValue(progress);

}

public void start() {

startActionButton.setEnabled(false);

}

public void done() {

startActionButton.setEnabled(true);

setProgress(100);

}

}

class MVC_Control {

private MVC_View view;

private MVC_Model model;

public MVC_Control(final MVC_View view, final MVC_Model model) {

this.view = view;

this.model = model;

model.addPropertyChangeListener(new PropertyChangeListener() {

public void propertyChange(PropertyChangeEvent pce) {

if (MVC_Model.PROGRESS.equals(pce.getPropertyName())) {

view.setProgress((Integer)pce.getNewValue());

}

}

});

}

public void doButtonAction() {

view.start();

SwingWorker swingworker = new SwingWorker() {

@Override

protected Void doInBackground() throws Exception {

model.reset();

model.startSearch();

return null;

}

@Override

protected void done() {

view.done();

}

};

swingworker.execute();

}

}

class MVC_Model {

public static final String PROGRESS = "progress";

private static final int MAX = 100;

private static final long SLEEP_DELAY = 100;

private int progress = 0;

private PropertyChangeSupport pcs = new PropertyChangeSupport(this);

public void setProgress(int progress) {

int oldProgress = this.progress;

this.progress = progress;

PropertyChangeEvent evt = new PropertyChangeEvent(this, PROGRESS, oldProgress, progress);

pcs.firePropertyChange(evt);

}

public void reset() {

setProgress(0);

}

public void addPropertyChangeListener(PropertyChangeListener listener) {

pcs.addPropertyChangeListener(listener);

}

public void startSearch() {

for (int i = 0; i < MAX; i++) {

int newValue = (100 * i) / MAX;

setProgress(newValue);

try {

Thread.sleep(SLEEP_DELAY);

} catch (InterruptedException e) {}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值