JavaFX events/listeners/handlers

JavaFX events/listeners/handlers

我的场景中有 2 个 listView 和 2 个自定义控件。当我按下 listView 中的一个项目时,我想引发事件,然后能够在应用程序的其他任何地方处理它。理想情况下,我希望我的 2 个自定义控件侦听此事件,并在引发时处理它。

不确定这是否正确,但到目前为止我有这个

这是我的自定义事件,我也想传入一个参数,它是哪个优惠,但不知道该怎么做?

public class OfferChangedEvent extends Event {

    private static final long serialVersionUID = 1L;

    public static final EventType<OfferChangedEvent> OFFER_CHANGED = new EventType<OfferChangedEvent>(ANY, "OFFER_CHANGED");

    public OfferChangedEvent() {
        this(OFFER_CHANGED);
    }

    public OfferChangedEvent(EventType<? extends Event> arg0) {
        super(arg0);
    }
    public OfferChangedEvent(Object arg0, EventTarget arg1, EventType<? extends Event> arg2) {
        super(arg0, arg1, arg2);
    }  
}

现在,在我的自定义控件之一上,我会在单击按钮时引发事件,就像这样

@FXML
public void showOffer(ActionEvent event) {
    Button btnView = (Button)event.getSource();

    // can i pass in parameter of the offer here??
    btnView.fireEvent(new OfferChangedEvent());
}

现在我想要一个列表视图来监听事件并处理它,我有这个但是它不起作用

    // when offer is changed, we dont want to see events
    this.eventListPane.addEventHandler(OfferChangedEvent.OFFER_CHANGED, new EventHandler<OfferChangedEvent>() {

        @Override
        public void handle(OfferChangedEvent event) {
            Console.Log("Recived");
            eventListPane.setVisible(false);
            // How can i get the argument of the offer passed???
        }
    });

遗憾的是,这个问题没有直接的答案。对于您的情况,大约有 3 种不同的方式来连接您的应用程序,以便不同的部分可以对其他部分的变化做出反应:

  1. 您可以绑定到属性并监听更改。
  2. 您可以设置侦听器,然后通知它们更改。
  3. 您可以使用消息传递总线。

您使用哪一个取决于多种因素,但考虑到您在上面所做的,我会选择第三个。你可以试试这个https://github.com/bennidi/mbassador