如何通过javafx中的事件传递参数?

use*_*191 2 java javafx

我有以下示例,其中我想将我的参数"text"与我的事件一起传递(当我的按钮"bla"被点击时).我该怎么做?

  EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            System.out.println(text);
        }
    };

    public void test(){
    //...

    Text text = "123567";

    bla.setOnMousePressed(handler);

    //...
    }
Run Code Online (Sandbox Code Playgroud)

小问题:

当我有以下内容时:

   object1.setOnMouseClicked( event -> {
        System.out.println("HELLO");
    });

   object2.setOnMouseClicked( event -> {
        System.out.println("HELLO");
    });
Run Code Online (Sandbox Code Playgroud)

两个对象,当它们"setOnMouseClicked"时做同样的事情.是否有合并它们的语法?

Joh*_*nRW 7

有多种方法可以实现.如果要传递的参数是事件源或目标的一部分,您可以:

  • 使用getSource或getTarget
  • 检查源类或目标类
  • 将源/目标强制转换为该类
  • 通过该类的getter和setter访问参数

但是,如果参数与事件无关,则必须编写自定义事件:

class CustomEvent extends Event {

    private String parameter;

    public static final EventType<CustomEvent> CUSTOM = new EventType(ANY, "CUSTOM");
    public CustomEvent(String parameter) {
        super(CustomEvent.CUSTOM);
        this.parameter = parameter;
    }

    public String getParameter() {
        return this.parameter;
    }

}
Run Code Online (Sandbox Code Playgroud)

现在要使用该事件,您首先必须解雇它.

你可以这样做

objectThatWillFireThisEvent.fireEvent(new CustomEvent("Get this parameter guys!"));
Run Code Online (Sandbox Code Playgroud)

所以你现在用参数触发了一个事件.现在设置EventHandler,将其添加到将触发事件的对象的类中:

public final void setOnCustomEvent(
        EventHandler<? super CustomEvent> value) {
    this.addEventHandler(CustomEvent.CUSTOM, value);
}
Run Code Online (Sandbox Code Playgroud)

现在您可以设置事件处理程序:

objectThatWillFireTheEvent.setOnCustomEvent( event -> {
    System.out.println(event.getParameter());
});
Run Code Online (Sandbox Code Playgroud)

或者,如果想要,您可以使用编写在问题中发布的事件处理程序的方式(如果您不想使用lambdas).

或者您可以调用您编写的函数,该函数应该处理该参数:

objectThatWillFireTheEvent.setOnCustomEvent( event -> myFunction(event.getParameter) );
Run Code Online (Sandbox Code Playgroud)

我希望我没有做任何错别字.但是如果某些东西不起作用或者您还有其他问题,请不要犹豫!:)

除此之外,我建议你去谷歌投射(如果你还不知道)以及更多自定义事件(因为我的回答只是一个起点,如果你想用自定义事件做更多疯狂的事情,最好阅读在那:D)

编辑:这是你在评论中的意思吗?

由于评论会破坏布局和可读性

String text = "This is text!";
Button button = new Button();
object.setOnMouseClicked( event -> {
    function1(text);
    function2(button);
});
Run Code Online (Sandbox Code Playgroud)