2015-01-09 4 views
1

Этот вопрос, возможно, направлен на создателя ReactFX, но другие могут ответить.ReactFX Consumer прослушивает несколько событий EventStream

я в настоящее время начинаю использовать ReactFX для совместного использования данных и обработки событий в приложении JavaFX. Мой вопрос: как класс может подписаться на прослушивание событий из двух (или более) разных EventStreams. Предположим, что в Controller class у меня есть textfield, который может быть обновлен с помощью new text(String), поэтому этот класс будет реализовывать Consumer<String>. Но тогда вы также можете захотеть, чтобы этот textfield был обновлен с помощью new Integer (например), исходя из совершенно другого источника, поэтому он должен был бы реализовать Consumer<Integer>, только вы не можете этого сделать, потому что он уже реализует Consumer<String>.

Я думал о создании класса пакета с полем идентификатора (например, с номером Enum) и Object field, содержащим данные, и назовите его ReactFXEventBundle. Только экземпляры этого класса могут использоваться как Events, где потребитель может идентифицировать тип события, анализируя поле id. Поэтому все потребительские классы будут реализовывать Consumer<ReactFXEventBundle>. Будет ли это правильным подходом?

ответ

1

Для того, чтобы убедиться, что мы находимся на той же странице, я предполагаю, что ваша ситуация выглядит как этот

class Controller { 
    TextField getTextField(); 
} 

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

и вы хотите, чтобы маршрут как strings и integers в TextField-х textProperty(). Это, как вы делаете это:

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

В словах, вы преобразовать поток целых чисел в поток строк, объединить две строки потоки и подачи объединенного потока в текстовое свойство поля. (feedTo(property) - это всего лишь стенография для subscribe(property::set)).

Обратите внимание, что ваш класс контроллера не обязательно должен выполнять Consumer. Экземпляр пользователя создается из справочника метода property::set.

+0

Спасибо за ответ, это определенно заставит меня задуматься обо всех возможностях, используя комбинации EventStream! –