我想为一个类扩展 SwingWorker,但我已经为此扩展了另一个类。我想知道是否有某种类似线程的解决方法(我们可以扩展它或实现它),以便我可以在 SwingWorker 的 doInBackground 方法中使用。
我有一个需要对其执行操作的对象列表。这些对象的类型为 A、B、C。 我创建了一个父类(super class) S,A、B、C 是该父类(super class)的子类。 我有一个 S 对象,在运行时浏览列表时,我找到列表中项目的类型,并将 S 类型转换为 A、B 或 C 并执行操作。 如果我将 S 设为 SwingWorker,则只能执行该操作一次,因为 Swing Worker 只能使用一次。 我无法让 A、B、C 扩展 SwingWorker,因为它们已经扩展了 S。 所以我需要为 A、B、C 实现 SwingWorker
我还有一个 A、B、C 将使用的 Connection 对象,并且我已将其设置为单例,因为我不想一次又一次地初始化。
最佳答案
下面是一个示例组合示例。
预期输出:
Received partial update list [Worker: start]
Progress: 20%...
Progress: 70%...
Progress: 100%...
Received partial update list [Worker: woken up, Worker: sending the result]
Worker Done
Launcher done.
代码:
package com.stackoverflow;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.SwingWorker;
public class DelegatingSwingWorkerDemo {
public static void main(String[] args) {
new Launcher().launch();
}
}
/**
* Use this, to launch the worker.
*/
class DelegatingSwingWorker<I, O> extends SwingWorker<I, O> {
SwingWorkerable<I, O> delegate;
Publisher<O> publisher;
public DelegatingSwingWorker(SwingWorkerable<I, O> delegate) {
this.delegate = delegate;
publisher = new Publisher<O>() {
@Override
public void publish(O... chunks) {
DelegatingSwingWorker.this.publish(chunks);
}
@Override
public void setProgress(int progress) {
DelegatingSwingWorker.this.setProgress(progress);
}
};
}
@Override
protected void process(List<O> chunks) {
delegate.process(chunks);
}
@Override
protected void done() {
delegate.done();
}
@Override
protected I doInBackground() throws Exception {
return delegate.doInBackground(publisher);
}
}
interface Publisher<O> {
void publish(O... chunks);
void setProgress(int progress);
}
/**
* Make your class implement the interface.
*/
interface SwingWorkerable<I, O> {
void process(List<O> chunks);
I doInBackground(Publisher<O> publisher);
void done();
}
/**
* Let's say this is your super class:
*/
class MySuperClass {
}
/**
* Use your super class, but implement the SwingWorkerable. Then
* launch using a DelegatingSwingWorker
*/
class SleepingDemoSwingWorkerable
extends MySuperClass
implements SwingWorkerable<String, String> {
@Override
public void process(List<String> chunks) {
System.out.println("Received partial update list " + chunks);
}
@Override
public String doInBackground(Publisher<String> publisher) {
publisher.publish("Worker: start");
try {
publisher.setProgress(0);
Thread.sleep(200);
publisher.setProgress(20);
Thread.sleep(500);
publisher.setProgress(70);
Thread.sleep(300);
publisher.setProgress(100);
publisher.publish("Worker: woken up");
} catch (InterruptedException e) {
e.printStackTrace();
}
publisher.publish("Worker: sending the result");
return "Second passed.";
}
@Override
public void done() {
System.out.println("Worker Done");
}
}
final class ConsoleProgressListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent event) {
switch (event.getPropertyName()) {
case "progress":
System.out.println("Progress: " + event.getNewValue() + "%...");
}
}
}
/**
* Launch
*/
class Launcher {
public void launch() {
SleepingDemoSwingWorkerable workerable = new SleepingDemoSwingWorkerable();
DelegatingSwingWorker<String, String> delegatingSwingWorker =
new DelegatingSwingWorker<String, String>(workerable);
delegatingSwingWorker.addPropertyChangeListener(new ConsoleProgressListener());
delegatingSwingWorker.execute();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Launcher done.");
}
}
关于java - 已经扩展任何其他类的类可以通过任何方式扩展或实现 SwingWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19109316/