java - 已经扩展任何其他类的类可以通过任何方式扩展或实现 SwingWorker

标签 java swing swingworker

我想为一个类扩展 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/

相关文章:

java - 如何在 Java 中使用进度条(Netbeans GUI)

java - 排除公共(public)项目的依赖

java - 在有限的空间内显示图像的特定部分?

java - 使用反射还是面向切面编程?

java - GWT - MVP 事件总线。创建多个处理程序

java - 更新 JavaFX 阶段的大小和位置不起作用

java - 为什么我的 if/else 语句总是跳到 else

java - 解析 csv 文件并存储结果,因为 JFree 图表数据集消耗堆空间

java - 我需要一个 JTextArea,它在行的末尾计算该行中的字符数

java - SwingWorker 从不返回任何东西? (java)