Запустив пойманное событие - PullRequest
0 голосов
/ 26 декабря 2018

Этот вопрос настолько очевиден, и я уверен, что его так легко решить, что я удивляюсь, почему еще не было опубликовано ни одного простого и понятного ответа.Я нашел ответы, объясняющие, как создать * новое событие, изменить направление события, -bubble и т. Д. Однако я не нашел Q / A относительно перехвата сигнала, а затем отослать его в класс пользователя, а затемк классу, который является пользователем этого пользовательского класса и так далее и тому подобное.Сказав это, вот мой вопрос.

Мой класс, ClassOne, получает сигнал кнопки, а затем должен передать этот сигнал на ClassTwo, который, в свою очередь, передает сигнал на ClassThreeКак, черт возьми, я делаю это в JavaFx .

Обратите внимание, что класс не должен запускать новое событие, но то же событие, которое было перехвачено.

Ниже приведено грамматическое объяснение того, что я пытаюсь сделать.

Любая помощь, и я имею в виду, что любой вклад будет наиболее ценным.

public class MyBoxedButton extends HBox {
  private Button btn;

  MyBoxedButton(){
    // Initialization of all the objects
    btn = new Button();
    //catch the event emitted by the button 
    btn.setOnAction((ActionEvent e) ->{

        // fire/emit the same received event
        ?????
    });
  }
}

/*
This class catches the event emitted by MyBoxedButton and then passes it to ClassThree, 
but this does not work, how then can I catch the event and then re-emit it.
*/
class ClassTwo(){
    private MyBoxedButton mbb;

    public ClassTwo(){
        mbb = new MyBoxedButton();
        //catch the event emitted by MyBoxedButton
        ????
        // re-emit the caught event
        ????
    }
}   

/*
This class catches the event emitted by ClassTwo.
The exersice is ment to show how the messages flow 
form one object to a next and then to a next, so on and so forth.
*/
class ClassThree(){
    private ClassTwo c2;

    public ClassThree(){
        c2 = new ClassTwo();
        //catch the event emitted by MyBoxedButton
        ????
        // re-emit the caught event
        ????
}   

1 Ответ

0 голосов
/ 29 декабря 2018

Пока ваши классы-обертки также расширяют Node, fireEvent должно делать свое дело, я думаю.

MyBoxedButton и ClassTwo должны будут обеспечить способ регистрациислушатель.

Я написал вспомогательный класс SimpleEventHandlerProperty , который делает это проще.Вот фрагмент кода из примера класса, который использует SimpleEventHandlerProperty, чтобы позволить зарегистрировать обработчик ActionEvent.

private final ObjectProperty<EventHandler<ActionEvent>> onNewSampleAction = new SimpleEventHandlerProperty<>(this,
        "onNewSampleAction", ActionEvent.ACTION, this::setEventHandler);


public final EventHandler<ActionEvent> getOnNewSampleAction() {
    return onNewSampleActionProperty().get();
}

public final void setOnNewSampleAction(EventHandler<ActionEvent> contentChanged) {
    onNewSampleActionProperty().set(contentChanged);
}

public ObjectProperty<EventHandler<ActionEvent>> onNewSampleActionProperty() {
    return onNewSampleAction;
}

Тогда ClassTwo и ClassThree могут зарегистрировать слушателя по мере необходимости.

Вспомогательный класс доступен в Maven Central:

<dependency>
    <groupId>org.drombler.commons</groupId>
    <artifactId>drombler-commons-fx-core</artifactId>
    <version>0.13</version>
</dependency>
...