This lightweight convenience library allows for simple integration between Project Reactor and
JavaFX. ReactorFX provides fluent
factories to create Flux for the propagation of events from JavaFX Controls,
Collections, and
Observables.
ReactorFX currently supports Java8+
compile "com.github.shadskii:reactorfx:1.8.0" //Java 8
In JavaFX user interactions are propagated through Events.
These Events can be emitted from Node, Scene, MenuItem, and Window. ReactorFX provides simple, fluent, and consistent
factories for the creation of Fluxes from these sources. You can create Fluxes by using FxFlux.from() and
passing the source and EventType to listen to. FxFlux.from() provides overloaded factories such that omitting the
EventType will result in a Flux that listens for ActionEvents.
Button btn = new Button("Hey I'm A Button!");
Flux<Event> buttonEvents = FxFlux.from(btn)
.subscribeOn(FxSchedulers.fxThread())
.publishOn(anotherScheduler);Scene scene = new Scene(new Label("Hey I'm A Label!"));
Flux<MouseEvent> mouseEvents = FxFlux.from(scene, MouseEvent.MOUSE_CLICKED)
.subscribeOn(FxSchedulers.fxThread())
.publishOn(anotherScheduler);Flux<WindowEvent> windowEvents = FxFlux.from(primaryStage, WindowEvent.WINDOW_HIDING)
.subscribeOn(FxSchedulers.fxThread())
.publishOn(anotherScheduler);Updates of any JavaFX ObservableValue can be emitted onto a Flux by using the factory FxFlux.from(ObservableValue<T> observableValue)
which creates a Flux that emits the initial value of the observable followed by any subsequent changes to the Observable. Often the
initial value of an ObservableValue is null. The reactive streams specification disallows null values in a sequence so these
null values are not emitted.
SimpleObjectProperty<String> observable = new SimpleObjectProperty<>();
Flux<String> flux = FxFlux.from(observable); Changes from an ObservableValue can also be emitted as a Change which is a pairing of the old value and the new value.
This Flux can be produced from the factory FxFlux.fromChangesOf(ObservableValue<T> observableValue).
SimpleObjectProperty<String> observable = new SimpleObjectProperty<>();
Flux<Change<String>> flux = FxFlux.fromChangesOf(observable)
.filter(change -> "Hello".equals(change.getOldValue()))
.filter(change -> "World".equals(change.getNewValue()));JavaFX controls are required to be updated on the JavaFX Application Thread. FxSchedulers.fxThread() is a
Scheduler that provides a way to easily the
JavaFX Application Thread. Using this scheduler makes it possible to listen to JavaFX controls using Reactive Streams.
ProgressBar p1 = new ProgressBar();
Flux.interval(Duration.ofMillis(1000))
.map(l -> l/100.0)
.publishOn(FxSchedulers.fxThread())
.subscribe(p1::setProgress);ReactorFX also provides fluent factories for creating a Flux from any JavaFX Collection
by four overloaded factory methods.
from()Using this factory will produce a Flux that emits the argument JavaFX Collection whenever it has been changed.
fromAdditionsOf()Using this factory produces a Flux that emits any element added to the argument collection after it has been added.
fromRemovalsOf()Using this factory produces a Flux that emits any element removed from the argument collection whenever it has been
removed.
fromChangesOf()Using this factory produces a Flux that emits a Change element as soon as any change (add/remove/modify) is performed on the underlying collection. If you want access to the actual underlying event from JavaFx collection, use this
The below factory method is provided for ObservableArray and it emits the changed sub-array of the argument array whenever it has been changed
fromChangedSubArrayOf()Licensed under Apache Software License 2.0
