![](/img/trans.png)
[英]any way to extend Activity if something else is already been extended?
[英]Any way for a class that has already extended any other class to extend or implement a SwingWorker
我想为一个类扩展SwingWorker,但是我已经为此扩展了另一个类。 我想知道是否有某种变通方法,例如在线程中(我们可以扩展它或实现它),这样我也许可以在SwingWorker的doInBackground方法中使用。
我有一个需要执行操作的对象列表。这些对象的类型为A,B,C。 我做了一个超类S,A,B,C是该超类的子类。 我有一个S对象,在运行时浏览列表时,我在列表中找到了项目的类型,并将S类型转换为A,B或C,然后执行操作。 如果将S设为SwingWorker,则只能执行一次操作,因为Swing worker只能使用一次。 我无法使A,B,C扩展SwingWorker,因为它们已经在扩展S。所以我需要为A,B,C实现SwingWorker
我也有一个A,B,C会使用的Connection对象,因为我不想一次又一次地初始化,所以将它作为Singleton来使用。
以下是示例组成示例。
预期产量:
收到部分更新列表[工作人员:开始]
进度:20%...
进度:70%...
进度:100%...
收到部分更新列表[工作人员:唤醒,工作人员:发送结果]
工人完成
启动器完成。
码:
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.");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.