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?
答案 0 :(得分:6)
你可以采用多种方式。 如果您要传递的参数是事件源或目标的一部分,您可以:
但是,如果参数与事件无关,则必须编写自定义事件:
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
希望这能回答您的问题。
如果您不明白,请问任何问题! :)