![](/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.