How to pass paremeter with an event in javafx?

时间:2016-02-12 21:11:06

标签: java javafx

I have this following example, where I want to pass my paremeter "text" together with my event (when my button "bla" is clicked). How can I do it?

scope

Small question:

When I do have the following:

  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);

    //...
    }

two objects, doing the same thing when "setOnMouseClicked" on them. is there any syntax to merge them?

2 个答案:

答案 0 :(得分:6)

你可以采用多种方式。 如果您要传递的参数是事件源或目标的一部分,您可以:

  • 使用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;
    }

}

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

您可以使用

执行此操作
objectThatWillFireThisEvent.fireEvent(new CustomEvent("Get this parameter guys!"));

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

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

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

objectThatWillFireTheEvent.setOnCustomEvent( event -> {
    System.out.println(event.getParameter());
});

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

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

objectThatWillFireTheEvent.setOnCustomEvent( event -> myFunction(event.getParameter) );

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

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

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

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

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

答案 1 :(得分:0)

如果您使用的是setOnMousePressed()方法,则可以直接使用lambda expression访问变量text

bla.setOnMousePressed(event -> {
    System.out.println(text);
});

但是,无论如何,如果您要使用EventHandler界面,或者如果要使用bla.addEventHandler();,这是一种更好的方法:

您看到的想法是创建一个自定义EventHandler,我们将需要的所有数据作为参数传递给自定义text

要创建自定义EventHandler,请创建一个abstract class implements接口的EventHandler

public abstract class CustomEventHandler implements EventHandler<Event>
{
    private String text;

    public CustomEventHandler(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

现在,您可以通过构造函数传递变量text

Button bla = new Button("bla");

String text = "123567";

bla.setOnMousePressed(new CustomEventHandler(text) {

    @Override
    public void handle(Event event) {
        System.out.println(getText());
    }
});

按下bla按钮时的输出:

123567

希望这能回答您的问题。
如果您不明白,请问任何问题! :)