【问题标题】:generating a MouseEvent in JavaFX在 JavaFX 中生成 MouseEvent
【发布时间】:2018-07-23 16:58:07
【问题描述】:

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

谢谢。

【问题讨论】:

  • 你可以使用java.awt.Robot.mouse*方法模拟鼠标点击
  • 对,但是如何将java.awt.event.MouseEvent 转换为javafx.scene.input.MouseEvent?处理实际事件的方法签名需要 javafx.* 包中的 MouseEvent
  • 如果您使用的是 Robot 类,它将模拟鼠标点击,Java FX 基础架构将自行捕获并创建所有需要的类。你就这么说吧,比如Robot.mousePress(10,10)

标签: events mouse javafx-2


【解决方案1】:

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

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));

【讨论】:

  • 包参考:import javafx.event.Event;导入 javafx.scene.input.MouseButton;导入 javafx.scene.input.MouseEvent;
  • 为什么要为所有修饰键(shiftDowncontrolDown 等)传递true?我假设简单的简点击不会关闭任何修饰符。
【解决方案2】:

您可以使用已弃用的 MouseEvent.impl_mouseEvent API 生成 MouseEvent。我之前在 forum thread 中为 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 添加了public constructors for javafx.event.MouseEvent 和(如 Jay Thakkar 的回答所示),您可以使用 Event.fireEvent 触发此类事件(您也可以使用 fire events on Windows)。

【讨论】:

  • 相当详尽的答案。谢谢。
  • Jira 访问对我有用。新的事件构造函数已添加到明年发布的Java 8 branch
【解决方案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();
    }
}

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

【讨论】:

    【解决方案4】:

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

    button1.setOnMouseClicked()....
    the corresponding property is
    button1.onMouseClickedProperty().get().handle(me);//where me is some MouseEvent object
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多