8

我需要模拟一个MouseEvent.MOUSE_CLICKED. 我想使用特定节点的fireEvent方法来调度上述类型的事件。但是,我正在努力生成一个。似乎javafx.scene.input.MouseEvent没有有效的构造函数,但可以通过这种方式实例化旧对象。尽管如此,我还没有找到任何有效的转换解决方案。我该如何解决这个问题?java.awt.event.MouseEvent

谢谢。

4

4 回答 4

16

这将在您的节点上触发一次主鼠标单击:

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));
于 2014-01-24T08:16:04.567 回答
8

您可以使用已弃用的 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 上触发事件)。

于 2012-07-19T18:31:32.313 回答
3

或者,您可以使用简单的“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();
    }
}

然后,要“单击”按钮,只需调用方法单击将按钮作为参数传递。

于 2014-12-17T17:42:43.967 回答
1

当你设置一个处理程序时,它会设置一个公共属性。您可以从该属性获取事件并调用 handle():

button1.setOnMouseClicked()....
the corresponding property is
button1.onMouseClickedProperty().get().handle(me);//where me is some MouseEvent object
于 2016-09-08T06:23:31.430 回答