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

如何通过javafx中的事件传递参数?,java,javafx,Java,Javafx,我有下面这个例子,我想把参数“文本”和我的事件一起传递(当我的按钮“bla”被点击时)。我怎么做 EventHandler<MouseEvent> handler = new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { System.out.println(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);

    //...
    }

两个对象,当“setonmouse单击”它们时做相同的事情。有什么语法可以合并它们吗?

有多种方法可以合并它们。 如果要传递的参数是事件源或目标的一部分,则可以:

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

}
因此,您现在启动了一个带有参数的事件。现在要设置EventHandler,请将其添加到将触发事件的对象的类中:

public final void setOnCustomEvent(
        EventHandler<? super CustomEvent> value) {
    this.addEventHandler(CustomEvent.CUSTOM, value);
}
或者,如果需要,您可以使用在问题中发布的方式编写事件处理程序(如果您不想使用lambdas)

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

objectThatWillFireTheEvent.setOnCustomEvent( event -> myFunction(event.getParameter) );
我希望我没有打错字。但是,如果有些东西不起作用,或者你还有其他问题,请不要犹豫

除此之外,我还建议你使用google casting(如果你还不知道的话)和更多关于定制活动的信息(因为我的回答只是一个起点,如果你想在定制活动中做更多疯狂的事情,最好是阅读:D)

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

因为注释会破坏布局和可读性

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

如果使用的是
setOnMousePressed()
方法,则可以直接使用以下命令访问变量
text

但是如果您打算使用
EventHandler
接口,或者如果您打算使用
bla.addEventHandler()这里有一个更好的方法:

您可以看到,我们的想法是创建一个定制的
EventHandler
,通过它我们可以传递所有我们需要的数据作为参数,即在我们的例子中
text

要创建自定义的
EventHandler
,请创建一个
抽象类
,该类实现
EventHandler
接口

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

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

    public String getText() {
        return text;
    }
}
按下
bla
按钮时输出:

123567
我希望这能回答你的问题。

如果你不明白,请把一切都问掉!:)

给我5分钟,需要进入我的计算机,但你的问题应该得到回答。在这里,你可以通过强制转换找到答案:如果你想不惜一切代价避免自定义事件,你可以使用自定义参数setter和getter扩展触发事件的类,并使用事件源/目标方法再次获取它。但是,我强烈建议不要这样做,因为概念上未连接到类的参数不应添加到实现中的类;)谢谢-另一个小问题:当我有两个元素时,让我们说“文本”和“按钮”-我想在“setOnMouseClick”完成后将它们绑定到这两个函数。。。是否有任何语法可以用来代替编写文本。setOnMouseClicked(new EventHandler(){….}+按钮。setOnMouseClicked(new EventHandler(){…}-有没有简单的方法,比如说text&button.setOnMouseClicked…-因为这样我就不需要上面的东西了-我可以说它对两个元素都会做同样的事情,当onmouse…,被Firededite我的答案,因为代码在注释中变得疯狂:)不,您必须为这两个对象设置事件处理程序,但是您可以使用相同的方法使用lambda处理这些事件(event->methodx())
String text = "This is text!";
Button button = new Button();
object.setOnMouseClicked( event -> {
    function1(text);
    function2(button);
});
bla.setOnMousePressed(event -> {
    System.out.println(text);
});
public abstract class CustomEventHandler implements EventHandler<Event>
{
    private String text;

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

    public String getText() {
        return text;
    }
}
Button bla = new Button("bla");

String text = "123567";

bla.setOnMousePressed(new CustomEventHandler(text) {

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