【问题标题】:Working with WorkerStateEvent without casting?在不强制转换的情况下使用 WorkerStateEvent?
【发布时间】:2013-10-05 15:51:18
【问题描述】:

我目前正在通过Concurrency API JavaFX 提供我的业务逻辑。但是有一个部分我偶然发现,我觉得 干净

基本上,如果您创建一个可能看起来像这样的服务

public class FooCommand extends Service<Foo> {
    @Override protected Task<Foo> createTask() {
        return new Foo();
    }
}

我设置了onSucceeded

FooCommand fooCommand = CommandProvider.get(FooCommand.class);
fooCommand.setOnSucceeded(new FooSucceededHandler());
fooCommand.start();

到这个类的一个实例

public class FooSucceededHandler implements EventHandler<WorkerStateEvent> {
    @Override public void handle(WorkerStateEvent event) {
        Foo f = (Foo) event.getSource().getValue();
    }   
}

但如您所见,我需要将Worker 的值转换为(Foo)。有什么更干净的方法吗?

【问题讨论】:

    标签: service concurrency event-handling javafx-2 task


    【解决方案1】:

    您可以创建自己的抽象类:

    public abstract class EventCallback<T> implements EventHandler<WorkerStateEvent> {
    
    @Override
    public void handle(final WorkerStateEvent workerStateEvent) {
        T returnType = (T) workerStateEvent.getSource().valueProperty().get();
        this.handle(returnType);
    }
    
    public abstract void handle(T objectReturned);
    
    }
    

    然后使用它:

    final EventCallback<MonType> eventCallback = new EventCallback<MonType>() {
            @Override
            public void handle(final MonType objectReturned) {
                // DO STUFF
            }
    };
    

    因为它也是一个EventHandler,所以兼容JavaFX并发API。

    【讨论】:

    • 好吧,这只会将问题转移到另一层。即使您不知道结果是否就是这个实例,您仍然可以输入您的摘要。问题是,您需要使用“程序员技能”而不是编译器的类型检查来捕获类型。我尝试扩展 WorkerStateEvent 但遗憾的是不起作用,因为它不允许子类(但是?我不知道 Java8)
    • 您不能在不实现自定义 CommandProvider / Service / 等的情况下扩展 WorkerStateEvent ......因为它们是管理这些事件的构造和调度的组件。因此,要么您等待 JavaFX 团队实现一个在 WorkerStateEvent 中通用的 value 属性(这意味着修改 JavaFX 中实例化此事件的每个部分),要么您创建自己的层来顺利管理演员表。我没有看到其他选择:(
    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2013-05-23
    • 2014-09-27
    • 1970-01-01
    • 2012-07-13
    • 2019-07-23
    相关资源
    最近更新 更多