【发布时间】:2016-05-26 14:54:42
【问题描述】:
我想生成一个随机数 5 次并重复 6 次。每次生成随机数时,我都会使用该数字和进度条更新 GUI。
为了做到这一点,我想到了一个 SwingWorker,它在 doInBackground() 方法上生成随机数,并使用 publish() 方法在 GUI 上显示该数字。我这样做完全没有问题,当我尝试这样做 6 次时出现问题,因为在 done() 方法中,我在 TextField 上添加了一个空格,用于显示所有数字
如何运行 6 次 SwingWorker,并在 SwingWorker 的 done() 方法完成后启动?
谢谢!
编辑:代码 sn -p
public class SwingWorkerEjemplo extends SwingWorker<Void, Integer> {
private JProgressBar pBar;
private JTextField txtSalida;
private JTextArea txtArea;
public SwingWorkerEjemplo(JProgressBar pBar,JTextField txt, JTextArea txtArea) {
this.pBar = pBar;
addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())){
pBar.setValue((Integer)evt.getNewValue());
}
}
});
this.pBar.setVisible(true);
this.pBar.setStringPainted(true);
this.pBar.setValue(0);
setProgress(0);
this.txtSalida = txt;
this.txtArea = txtArea;
}
@Override
protected Void doInBackground() throws Exception {
int num;
for (int i=0;i<5;i++){
num = ThreadLocalRandom.current().nextInt(1, 7);
publish(num);
setProgress(i+1);
Thread.sleep(100);
}
return null;
}
@Override
protected void done() {
try {
txtSalida.setText(txtSalida.getText()+" ");
Thread.sleep(0);
txtArea.append("");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
protected void process(List<Integer> chunks) {
Integer valor = chunks.get(chunks.size()-1);
txtSalida.setText(txtSalida.getText()+String.valueOf(valor));
}
}
在 MainWindow.java 中
SwingWorkerEjemplo swe = new SwingWorkerEjemplo(pBar, txtNumeros, txtSalida);
swe.execute();
System.out.println("Worker 1");
swe = new SwingWorkerEjemplo(pBar, txtNumeros, txtSalida);
swe.execute();
System.out.println("Worker 2");
swe = new SwingWorkerEjemplo(pBar, txtNumeros, txtSalida);
swe.execute();
System.out.println("Worker 3");
swe = new SwingWorkerEjemplo(pBar, txtNumeros, txtSalida);
swe.execute();
System.out.println("Worker 4");
swe = new SwingWorkerEjemplo(pBar, txtNumeros, txtSalida);
swe.execute();
System.out.println("Worker 5");
swe = new SwingWorkerEjemplo(pBar, txtNumeros, txtSalida);
swe.execute();
System.out.println("Worker 6");
结果首先是 工人 1 工人 2 工人 3 工人 4 工人 5 工人 6 然后像 xxxxxyyyyyzzzzzaaaaabbbbbcccccddddd 之类的东西
【问题讨论】:
-
请添加代码 sn-p 和你得到的结果
标签: java multithreading swing user-interface swingworker