我正在尝试学习JavaFX事件处理.我发现我们可以通过两种方式注册事件.
一个是方便的方法等setOnAction(EventHandler),setOnMouseClicked(EventHandler)
第二是使用 addEventHandler(MouseEvent.MOUSE_CLICKED, EventHandler)
但我很困惑他们之间的区别是什么?如何决定哪一个适合?
我已经使用两种方法测试并注册了两个事件处理程序,两者都正常工作.
Button btn = new Button("Click Me One!");
btn.setOnMouseEntered(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent e){
System.out.println("Mouse Entered on Click Me One");
}
});
btn.setOnMouseExited(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent e){
System.out.println("Mouse Exited from Click Me One");
}
});
Button btn2 = new Button("Click Me Two!");
btn2.addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent e){
System.out.println("Mouse Entered on Click Me Two");
}
});
btn2.addEventHandler(MouseEvent.MOUSE_EXITED, new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent e){
System.out.println("Mouse Exited from Click Me Two");
}
});
Run Code Online (Sandbox Code Playgroud)
这是检查后的输出.
Mouse Entered on Click Me One
Mouse Exited from Click Me One
Mouse Entered on Click Me Two
Mouse Exited from Click Me Two
Run Code Online (Sandbox Code Playgroud)
我还通过定义事件处理程序来检查.
Button btn2 = new Button("Click Me Two!");
// Define an event handler
EventHandler<InputEvent> handler = new EventHandler<InputEvent>() {
public void handle(InputEvent event) {
System.out.println("Handling event " + event.getEventType());
}
};
btn2.addEventHandler(MouseEvent.MOUSE_ENTERED, handler);
btn2.addEventHandler(MouseEvent.MOUSE_EXITED, handler);
btn2.setOnMouseEntered(handler);
btn2.setOnMouseExited(handler);
Run Code Online (Sandbox Code Playgroud)
输出:
Handling event MOUSE_ENTERED
Handling event MOUSE_ENTERED
Handling event MOUSE_EXITED
Handling event MOUSE_EXITED
Run Code Online (Sandbox Code Playgroud)
经过我自己的测试后,我明白了There can only one handler of same type with convention 的含义是什么。所以我要回答我自己的问题。
setOnXXX()我发现方法和方法之间有两个主要区别addEventHandler
1:您注册的事件addEventHandler()将首先执行。这是示例。
Button btn = new Button("Hover Me!");
btn.setOnMouseEntered(new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Handling event with Convience Method");
}
});
btn.addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Handling event with addEventHandler");
}
});
Run Code Online (Sandbox Code Playgroud)
输出:
Handling event with addEventHandler
Handling event with Convience Method
Run Code Online (Sandbox Code Playgroud)
阅读James_D的评论后,我添加了原始文档中的段落作为第一个区别。
一个节点可以注册多个处理程序。每个处理程序的调用顺序基于事件类型的层次结构。特定事件类型的处理程序在通用事件类型的处理程序之前执行。例如,KeyEvent.KEY_TYPED 事件的处理程序在 InputEvent.ANY 事件的处理程序之前调用。未指定同一级别的两个处理程序的执行顺序,但由使用便捷方法中描述的便捷方法注册的处理程序最后执行。
2:第二个区别是您可以使用相同的方式添加多个处理程序EventType(正如我使用的 Mouse_Entered 事件)addEventHandler();,但如果setOnXXX();最后注册的事件处理程序将执行。这是示例。
Button btn = new Button("Hover Me!");
btn.setOnMouseEntered(new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Handling event 1 with Convenience Method");
}
});
btn.setOnMouseEntered(new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Handling event 2 with Convenience Method");
}
});
btn.addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Handling event 1 with addEventHandler");
}
});
btn.addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Handling event 2 with addEventHandler");
}
});
Run Code Online (Sandbox Code Playgroud)
输出:
Handling event 1 with addEventHandler
Handling event 2 with addEventHandler
Handling event 2 with Convenience Method
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我使用两种方式注册了两个事件处理程序。但以便捷方法的方式执行最后一个事件处理程序。为了完成答案,让我复制jns答案中的段落。
因此,如果您只需要一种方法,
EventHandler那么使用哪种方法都没有区别。但是,如果您需要应用多个事件处理程序 ,则EventType必须使用以下命令添加它们addEventhandler
看看Node setEventHandler的javadoc (从中调用setOnXXX):
设置要用于此事件类型的处理程序.一次只能指定一个这样的处理程序.保证在使用addEventHandler(javafx.event.EventType,javafx.event.EventHandler)}添加的处理程序之后,将此处理程序作为最后一个调用.
因此,如果您只需要一个,EventHandler那么您使用的方法没有区别.但是,如果您需要EventHandlers为同一个应用多个,则EventType必须使用它们添加它们addEventhandler
| 归档时间: |
|
| 查看次数: |
5342 次 |
| 最近记录: |