ReactFX Consumer listening to more than one EventStream

This question is perhaps aimed at the creator of ReactFX, but others are welcome to answer.

I am currently starting to use ReactFX for data sharing and event handling within a JavaFX application. My question is how can a class subscribe to listen to events from two(or more) different EventStreams. Suppose that in a Controller class I have a textfield that may be updated with a new text(String), so this class would implement Consumer<String>. But then you may also want for this textfield to be updated with a new Integer (for example) coming from a totally different source, so it would have to implement Consumer<Integer>, only you can’t do that because it already implements Consumer<String>.

I thought about creating a bundle class with an id field(with an Enum for example) and an Object field containing the data, lets name it ReactFXEventBundle. Only instances of this class will be able to be used as Events, where the consumer can identify the type of Event by analyzing the id field. Therefore, all Consumer classes would implement Consumer<ReactFXEventBundle>. Would this be the right approach?

Answer

To make sure we are on the same page, I assume your situation looks something like this

class Controller {
    TextField getTextField();
}

EventStream<String> strings;
EventStream<Integer> integers;

and you want to route both strings and integers to TextField’s textProperty(). This is how you do that:

EventStreams.merge(
    strings,
    integers.map(Integer::toString)
).feedTo(controller.getTextField().textProperty());

In words, you convert the stream of integers to a stream of strings, merge the two string streams and feed the merged stream into the text property of the field. (feedTo(property) is just a shorthand for subscribe(property::set)).

Note that your controller class doesn’t have to implement Consumer directly. The consumer instance is created from the property::set method reference.

Leave a Reply

Your email address will not be published. Required fields are marked *