2013-10-05 33 views
1

我目前通過Concurrency API JavaFX提供調度業務邏輯。但有一部分我偶然發現,對我而言,感覺不到乾淨在不投射的情況下使用WorkerStateEvent?

基本上如果你創建一個服務,它可能看起來像這樣

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(); 
    } 
} 

但作爲實例你可以看到我需要投入的價值至(Foo)。有沒有更乾淨的方法來做到這一點?

回答

0

你可以只讓自己的抽象類:

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 
     } 
}; 

因爲它也是一個事件處理程序,它與JavaFX的併發API兼容。

+0

好吧,這只是將問題轉移到另一層。無論如何,即使你不知道結果是否是這個實例,你仍然在抽象中進行投射。問題是,你需要通過使用「程序員技能」來捕獲類型,而不是編譯器的類型檢查。我嘗試了擴展WorkerStateEvent,但確實不行,因爲它不允許使用子類(但是我​​不知道Java8) – thatsIch

+0

如果沒有實現自定義CommandProvider/Service/etc,那麼不能擴展WorkerStateEvent ...因爲它們是管理這些事件的構建和分派的組件。因此,要麼等待JavaFX團隊實現一個在WorkerStateEvent內部通用的值屬性(這意味着修改此事件實例化的JavaFX的每個部分),要麼讓您自己的圖層順利地管理演員陣列。我沒有看到另一個選項:( – zenbeni

相關問題