Swing worker 重写过程 <T,V>
Swing worker override process <T,V>
我正在尝试覆盖 process()
方法以确保某些代码在 EDT 中运行。我已经确保 <T,V>
始终匹配,但它仍然不会让我覆盖。这是我的代码:
final SwingWorker<ArrayList<Block>,Integer[]> swingSlaveLabourer = new SwingWorker<ArrayList<Block>, Integer[]>() {
@Override
protected ArrayList<Block> doInBackground() throws Exception {
blockList.doHeavyWork()..
Integer [] status = new Integer[2];
status[0] = 1;
status[1] = 0;
this.process(status);
return blockList;
}
@Override //wont allow override
protected void process (Integer[] chunks){
progressBar.setValue(chunks[0]);
}
};
process
方法以 List<V>
作为参数。它代表所有已发布的数据块。您需要将代码更改为:
@Override
protected void process(List<Integer[]> chunks) {
// do something
}
您不应从 doInBackground
方法中直接调用 process
。相反,您应该调用 publish
来发布每个数据块。
请参考以下摘自 SwingWorker
Javadoc 的示例:
class PrimeNumbersTask extends SwingWorker<List<Integer>, Integer> {
PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
//initialize
}
@Override
public List<Integer> doInBackground() {
while (! enough && ! isCancelled()) {
number = nextPrimeNumber();
publish(number); // each computed number is published
setProgress(100 * numbers.size() / numbersToFind); // and progress updated
}
}
return numbers;
}
@Override
protected void process(List<Integer> chunks) {
// in the mean while, we print each published value to a textarea
for (int number : chunks) {
textArea.append(number + "\n");
}
}
}
我正在尝试覆盖 process()
方法以确保某些代码在 EDT 中运行。我已经确保 <T,V>
始终匹配,但它仍然不会让我覆盖。这是我的代码:
final SwingWorker<ArrayList<Block>,Integer[]> swingSlaveLabourer = new SwingWorker<ArrayList<Block>, Integer[]>() {
@Override
protected ArrayList<Block> doInBackground() throws Exception {
blockList.doHeavyWork()..
Integer [] status = new Integer[2];
status[0] = 1;
status[1] = 0;
this.process(status);
return blockList;
}
@Override //wont allow override
protected void process (Integer[] chunks){
progressBar.setValue(chunks[0]);
}
};
process
方法以 List<V>
作为参数。它代表所有已发布的数据块。您需要将代码更改为:
@Override
protected void process(List<Integer[]> chunks) {
// do something
}
您不应从 doInBackground
方法中直接调用 process
。相反,您应该调用 publish
来发布每个数据块。
请参考以下摘自 SwingWorker
Javadoc 的示例:
class PrimeNumbersTask extends SwingWorker<List<Integer>, Integer> {
PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
//initialize
}
@Override
public List<Integer> doInBackground() {
while (! enough && ! isCancelled()) {
number = nextPrimeNumber();
publish(number); // each computed number is published
setProgress(100 * numbers.size() / numbersToFind); // and progress updated
}
}
return numbers;
}
@Override
protected void process(List<Integer> chunks) {
// in the mean while, we print each published value to a textarea
for (int number : chunks) {
textArea.append(number + "\n");
}
}
}