簡體   English   中英

已擴展任何其他類的類以任何方式擴展或實現SwingWorker

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM