我需要模拟一个MouseEvent.MOUSE_CLICKED
. 我想使用特定节点的fireEvent方法来调度上述类型的事件。但是,我正在努力生成一个。似乎javafx.scene.input.MouseEvent没有有效的构造函数,但可以通过这种方式实例化旧对象。尽管如此,我还没有找到任何有效的转换解决方案。我该如何解决这个问题?java.awt.event.MouseEvent
谢谢。
这将在您的节点上触发一次主鼠标单击:
import javafx.event.Event;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
Event.fireEvent(YOUR NODE, new MouseEvent(MouseEvent.MOUSE_CLICKED, 0,
0, 0, 0, MouseButton.PRIMARY, 1, true, true, true, true,
true, true, true, true, true, true, null));
您可以使用已弃用的 MouseEvent.impl_mouseEvent API 生成 MouseEvent。我之前在JavaFX 2.0的这个论坛主题中这样做过。请注意,该 API 已被弃用是有原因的 - 它是用于实现 JavaFX 的私有 API,并且不保证该 API 保持相同的签名,甚至不保证在未来的版本中存在(这可以证明,因为我在论坛主题不再编译。
生成此类事件的正确解决方案是拥有一个公共 API,因此支持这一点。已经提交了提供此功能的请求RT-9383 "Add proper constructors & factory methods to event classes, remove impl"。这个 jira 计划在明年为 JavaFX 3.0 完成。
同时,使用 Sergey 建议的 Robot 类可能是您最好的方法。
更新: Java 8为 javafx.event.MouseEvent 添加了公共构造函数(如 Jay Thakkar 的回答所示),您可以使用Event.fireEvent触发此类事件(您也可以在 Windows 上触发事件)。
或者,您可以使用简单的“hack”来以编程方式单击按钮。在“Util”类中创建此方法:
public static void click(javafx.scene.control.Control control) {
java.awt.Point originalLocation = java.awt.MouseInfo.getPointerInfo().getLocation();
javafx.geometry.Point2D buttonLocation = control.localToScreen(control.getLayoutBounds().getMinX(), control.getLayoutBounds().getMinY());
try {
java.awt.Robot robot = new java.awt.Robot();
robot.mouseMove((int)buttonLocation.getX(), (int)buttonLocation.getY());
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
robot.mouseMove((int) originalLocation.getX(), (int)originalLocation.getY());
} catch (Exception e) {
e.printStackTrace();
}
}
然后,要“单击”按钮,只需调用方法单击将按钮作为参数传递。
当你设置一个处理程序时,它会设置一个公共属性。您可以从该属性获取事件并调用 handle():
button1.setOnMouseClicked()....
the corresponding property is
button1.onMouseClickedProperty().get().handle(me);//where me is some MouseEvent object