JavaFX中如何获取鼠标位置?

2024-05-08

我是java(fx)的初学者。
如何在 JavaFX 中获取鼠标在 x 和 y 中的位置?我尝试使用 AWTMouseInfo(也导入了它),但它不起作用。我还在 Ensembles 中看到了它的代码(在“高级阶段”拖动球窗口,这就是我需要做的,拖动我未装饰的 JavaFX 阶段),但它也不起作用。我正在将 FXML 与控制器一起使用,我想这是主要问题。我应该切换回单文件简单 JavaFX 吗?我知道 FXML 更适合布局 UI,但我无法让许多此类代码正常工作。或者我的控制器是否需要其他类型的代码?请尽可能提供正确的代码和注释。
如果您需要检查我的一些代码,请随时询问。


你的问题中有几个问题——我会一次解决一个问题。

如何在 JavaFX 中获取鼠标在 x 和 y 中的位置?

将鼠标事件处理程序添加到要跟踪鼠标位置的相应 JavaFX 组件。JavaFX 鼠标事件将报告多种不同类型的坐标。 x 和 y 坐标相对于正在监视其位置的节点的左上角。 sceneX 和 sceneY 坐标相对于场景的左上角 0,0 坐标。 screenX 和 screenY 坐标相对于当前屏幕的左上角 0,0 坐标。

这些坐标记录在鼠标事件 http://docs.oracle.com/javafx/2/api/javafx/scene/input/MouseEvent.html文档。在理解坐标系方面有额外的信息Node http://docs.oracle.com/javafx/2/api/javafx/scene/Node.html and Scene http://docs.oracle.com/javafx/2/api/javafx/scene/package-summary.html文档。

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.stage.*;

public class MouseLocationReporter extends Application {
  private static final String OUTSIDE_TEXT = "Outside Label";

  public static void main(String[] args) { launch(args); }

  @Override public void start(final Stage stage) {
    final Label reporter = new Label(OUTSIDE_TEXT);
    Label monitored = createMonitoredLabel(reporter);

    VBox layout = new VBox(10);
    layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 10px;");
    layout.getChildren().setAll(
      monitored,
      reporter
    );
    layout.setPrefWidth(500);

    stage.setScene(
      new Scene(layout)
    );

    stage.show();
  }

  private Label createMonitoredLabel(final Label reporter) {
    final Label monitored = new Label("Mouse Location Monitor");

    monitored.setStyle("-fx-background-color: forestgreen; -fx-text-fill: white; -fx-font-size: 20px;");

    monitored.setOnMouseMoved(new EventHandler<MouseEvent>() {
      @Override public void handle(MouseEvent event) {
        String msg =
          "(x: "       + event.getX()      + ", y: "       + event.getY()       + ") -- " +
          "(sceneX: "  + event.getSceneX() + ", sceneY: "  + event.getSceneY()  + ") -- " +
          "(screenX: " + event.getScreenX()+ ", screenY: " + event.getScreenY() + ")";

        reporter.setText(msg);
      }
    });

    monitored.setOnMouseExited(new EventHandler<MouseEvent>() {
      @Override public void handle(MouseEvent event) {
        reporter.setText(OUTSIDE_TEXT);
      }
    });

    return monitored;
  }
}

我尝试使用AWT的MouseInfo(也导入了它),但它不起作用。

不要这样做。混合不同的图形工具包(例如 Swing/AWT 和 JavaFX)是一个高级主题。一般来说,如果您正在编写 JavaFX 应用程序,请避免从java.awt命名空间和javax.swing命名空间。仅当您有一个大型的现有基于 Swing 的应用程序或框架且需要与 JavaFX 应用程序进行互操作时,您才真正需要使用它们。在这种情况下,你就不存在这种情况。

我还在 Ensembles 中看到了它的代码(在“高级阶段”拖动球窗口,这就是我需要做的,拖动我未装饰的 JavaFX 阶段),但它也不起作用。

我尝试了 Ensemble Advanced Stage 示例,拖动该舞台对我来说很有效。

在 JavaFX 中拖动未装饰舞台的另一个示例是在答案中如何使用 JavaFX 2 绘制时钟? https://stackoverflow.com/questions/10541738/how-to-draw-a-clock-with-javafx-2其中有相关示例代码 https://gist.github.com/jewelsea/3388637。用于使时钟样本的未装饰阶段可拖动的方法是:

/** makes a stage draggable using a given node */
public static void makeDraggable(final Stage stage, final Node byNode) {
  final Delta dragDelta = new Delta();
  byNode.setOnMousePressed(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
      // record a delta distance for the drag and drop operation.
      dragDelta.x = stage.getX() - mouseEvent.getScreenX();
      dragDelta.y = stage.getY() - mouseEvent.getScreenY();
      byNode.setCursor(Cursor.MOVE);
    }
  });
  byNode.setOnMouseReleased(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
      byNode.setCursor(Cursor.HAND);
    }
  });
  byNode.setOnMouseDragged(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
      stage.setX(mouseEvent.getScreenX() + dragDelta.x);
      stage.setY(mouseEvent.getScreenY() + dragDelta.y);
    }
  });
  byNode.setOnMouseEntered(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
      if (!mouseEvent.isPrimaryButtonDown()) {
        byNode.setCursor(Cursor.HAND);
      }
    }
  });
  byNode.setOnMouseExited(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
      if (!mouseEvent.isPrimaryButtonDown()) {
        byNode.setCursor(Cursor.DEFAULT);
      }
    }
  });
}

我正在将 FXML 与控制器一起使用,我想这是主要问题。我应该切换回单文件简单 JavaFX 吗?我知道 FXML 更适合布局 UI,但我无法让许多此类代码正常工作。

您的主要问题可能是缺乏对底层 JavaFX API 的理解和熟悉,而不是使用 FXML。然而,fxml 带来的额外复杂性以及网络上较轻的文档和示例可能会给您带来困难。如果使用 FXML 使您难以理解如何使某些 JavaFX 函数发挥作用,我建议暂时停止使用 FXML。使用 Java API 手动编写逻辑并参考Oracle JavaFX 教程 http://docs.oracle.com/javafx/集成示例代码 http://www.oracle.com/technetwork/java/javafx/samples/index.html当你遇到对你来说困难的事情时。

一旦您习惯了直接使用 JavaFX API 进行编码,就可以切换回使用 FXML 来处理包含许多 GUI 元素的大型项目。 FXML 元素和属性本身几乎完全基于标准 JavaFX API 的反映而构建。因此,如果您了解核心 JavaFX API,您也就了解了有关 FXML 的几乎所有内容。

请不要对此答案发表后续评论(因为这个答案已经足够长了)。如果您有新问题,请创建一个新问题(每个问题一个问题)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX中如何获取鼠标位置? 的相关文章

  • 执行鼠标单击而不移动光标

    除了移动光标之外 我找不到任何解决方案Cursor类 点击mouse event然后将光标移动到原来的位置 我正在玩SendInput现在可以运行 但仍然没有机会找到好的解决方案 有什么建议吗 您应该使用 Win32 API 使用 user
  • mobileapplication.mobileevent BACK_BUTTON_PRESSED

    我的两个视图中有 2 个 Android 本机音频实例 当用户按下后退按钮并离开视图时 我试图让音频停止 因为它不会自动发生 我查看了文档并看到了 MobileEvent 类 我尝试实现它的构造函数 但没有成功 这是我的第一个应用程序 为此
  • 在 Java 中捕获(捕获)窗口中的鼠标光标

    我正在寻找一种方法 在鼠标进入窗口后捕获或捕获该窗口中的鼠标 就像鼠标被捕获在虚拟机窗口中一样 直到用户按 CTRL ALT DEL 或以其他方式释放鼠标 我如何在 Java 中实现这一点 全屏显示不是一个选择 EDIT 这里有一些 SSC
  • 带有地图的 JavaFX TableView 对象

    因此 我对 JavaFx TableView 进行了一些挖掘 并找到了一些针对简单情况的不错的解决方案 This article http docs oracle com javafx 2 ui controls table view ht
  • 将文本粘贴到 Macintosh 上的 emacs 中

    我使用的是 Macintosh 并且使用 终端 作为我的 shell 当我从任何窗口复制文本 通过鼠标拖动 然后鼠标右键菜单 gt 复制 然后将文本 鼠标右键 gt 粘贴 粘贴到运行 emacs 的终端中时 它不会充当粘贴 相反 它就像输入
  • Android - 如何简单地拖放按钮?

    我在这里找到了一个适合初学者的教程 http androidrox wordpress com 2011 05 13 android sample app drag and drop image using touch http andro
  • 如何使用 JRE 部署 JavaFX 11 桌面应用程序

    我有一个 JavaFX JDK 8 桌面业务应用程序 它使用 Java Web Start 进行部署 用户安装了 Java 8 只需访问 URL 我的 AWS Linux 服务器上的公共 URL 即可下载 启动应用程序 使用 Web Sta
  • 为什么禁用阶段可调整大小在 javafx 中不起作用?

    当我尝试setResizable对于我在 javaFX 应用程序中的场景 它不起作用 我仍然可以更改窗口大小 这是我的测试应用程序的代码 Override public void start Stage stage throws Excep
  • WPF 自定义控件构造、触发器和事件

    我想构建一个新的自定义控件 我发现很少有教程可以给我一些如何实现这一目标的线索 据我了解 创建新的自定义控件总是通过扩展当前控件来完成 甚至可以扩展 例如 从层次结构的非常基本的级别进行控制 您甚至可以扩展 用户界面元素 框架元素 Cont
  • JavaFX 模块对于 VM 不可见

    我使用 Intellij Idea 作为我的 IDE 由于我需要使用 css 文件 因此我安装了 Intellij Ultimate 现在 javaFx 不适用于它们 抛出异常 boot层初始化时出错 java lang module Fi
  • 在 Javafx 中单击内部时,透明舞台不应最小化

    我正在学习在 JavaFx 中创建屏幕录制应用程序 我希望用户调整矩形的大小来决定屏幕捕获区域 我已将舞台和场景设为透明primaryStage initStyle StageStyle TRANSPARENT and scene setF
  • 更改JavaFX TableView字体大小[重复]

    这个问题在这里已经有答案了 您好 我想在表视图列内的文本上设置字体 我如何用 Java 做到这一点 这是我的代码 感谢帮助 private final TableView
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • wxWidgets:检测自定义控件上的单击事件

    如何向使用 wxWidgets 制作的自定义控件添加单击事件侦听器 自定义控件使用wxWindow作为基础 在活动列表中我看到 wxEVT LEFT DOWN wxEVT LEFT UP wxEVT LEFT DCLICK wxEVT MI
  • JavaFX 多线程 - 连接线程不会更新 UI

    我正在尝试创建一个加载程序对话框 用户可以在其中知道程序正在加载所请求的内容并且程序正在按预期运行 但正因为如此 我需要join 解析器线程和之前继续主线程 这使得对话框空白 解析器任务 java public class ParserTa
  • 在模块路径上使用 OpenJFX 11 JMODS 在 JDK 11 上运行 javafx 示例

    我已经从 OpenJFX 项目下载了 JavaFX Jmod 文件并将它们放在目录中G openjfx javafx jmods 11 我使用的是 OpenJDK 11 其中没有 JavaFX jmodJAVA HOME jmods即它不附
  • JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值回绕到最小值

    我创建了一个带有值的整数微调器 min 5 max 15 and initialValue 12 and wrapAround true 一旦旋转器到达max 15 增量期间的值 而不是将值重置为min 5 正如它所说文档 https op
  • Mac OS X 下的 JavaFX:系统菜单和模态窗口

    我目前面临 Mac OS X 下的 JavaFX 菜单和模式对话框的问题 我正在使用该方法 MenuBar setUseSystemMenuBar true 为了将系统菜单栏用于我的应用程序菜单 这工作正常 但如果模式对话框打开 菜单不会被
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • Kendo Ui 像 Windows 桌面一样可拖动

    我需要模拟桌面图标拖放 我这样做 draggable kendoDraggable container desktop hint function return draggable clone dragend function e cons

随机推荐

  • 在 IOS9 中的 Cordova 应用程序上使用 JQuery/Javascript 的 window.history 问题

    我在 IOS9 测试版 下使用 Cordova 应用程序时遇到问题 我正在使用最新的 Cordova 和 JQuery 移动版本 window history 未更新 导致以下故障 window history go 1 无法返回页面 即使
  • 在 javascript/jquery 中获取图像的完整尺寸

    我在页面上有一个图像 该图像已调整大小以适合 div 例如 400x300 如何在 jQuery 中获取图像的完整尺寸 4000x3000 width 和 height 似乎只返回图像的当前大小 图像有naturalWidth and na
  • ViewStart 和 Layout - 有什么区别?

    我刚刚开始阅读 ASP NET MVC 4 这本书并遇到一个问题 在 Razor 部分作者说 如果我不在 View cshtml 文件中设置布局变量 它将默认搜索 ViewStart cshtml 但在另一部分中 他在 Views Shar
  • 如何显示 matplotlib 饼图中的实际值

    我有一个饼图 绘制从 CSV 文件中提取的值 当前显示值的比例 百分比显示为 autopct 1 1f 有没有办法显示每个切片的数据集中表示的实际值 Pie for Life Expectancy in Boroughs import pa
  • 覆盖 Rails ActiveRecord 销毁行为的最佳方法是什么?

    我有一个应用程序 我想在其中覆盖许多模型的销毁行为 用例是用户可能有删除特定记录的合法需要 但实际上从数据库中删除该行会破坏引用完整性 从而影响其他相关模型 例如 系统的用户可能想要删除不再与其有业务往来的客户 但需要维护与该客户的交易 看
  • 对 Parquet 批量格式使用压缩

    从 Apache Flink 1 15 版本开始 您可以使用压缩功能将多个文件合并为一个 https nightlies apache org flink flink docs master docs connectors datastre
  • 如何让 selenium 等待页面在 Selenium - Excel VBA 包装器中完全加载?

    Selenium Excel VBA 的包装器使用什么代码或函数 以便程序将等待页面完全加载然后执行其他命令 最新版本在执行所需操作之前隐式等待目标元素存在 例如 driver FindElementById Click 默认情况下会在抛出
  • 使用 R 中绘制的标准误差创建条形图

    我试图找到在 R 中创建条形图并显示标准错误的最佳方法 我看过其他文章 但我无法弄清楚与我自己的数据一起使用的代码 之前没有使用过 ggplot 这似乎是最常用的方法 而 barplot 不与数据框合作 我需要在两种情况下使用它 我为此创建
  • 如何舍入 Ballerina 中的浮点值?

    在 BallerinaLang 中 如何将浮点值四舍五入到指定的小数位数 Ballerina尚未提供浮动收尾的具体方法 但使用数学 圆 https ballerina io learn api docs ballerina math htm
  • Flutter中的pushReplacementNamed和popAndPushNamed有什么区别?

    The NavigatorState班级在Flutter navigator dart有 2 种具有类似行为的方法 有什么区别pushReplacementNamed and popAndPushNamed在颤振中 pushReplacem
  • HAProxy - 如果第一台机器返回 404,则从第二台机器提供 URL

    我遇到过这样的情况 网站的一部分 某些 URL 路径 由一台后端服务器提供服务 而所有其他 URL 则由 HAProxy 中的不同默认后端提供服务 现在 由于应用程序逻辑的编写方式 可以在两台物理服务器计算机中的任意一台上的同一路径上创建要
  • Javascript RegEx 替换所有不在 HTML 标签内的字符

    寻求一些帮助 我的正则表达式有点生锈 我试图用一个字符替换 javascript 中 HTML 标签之外的所有字符 例如 用破折号 替换这些字符 div class test Lorem Ipsum br Dolor Sit Amet di
  • 我如何将值从基本适配器传递到活动

    我正在一个应用程序中工作 我需要将值从基本适配器类传递到活动 这是片段代码 public View getView int position View convertView ViewGroup parent vi convertView
  • 如何查找 SQL Server 数据库中所有空间的使用情况

    我们有一个 SQL Server 数据库 根据 Microsoft SQL Server Management Studio 的数据 该数据库只有 6436Mb 中的 119Mb 可用 然而命令 EXEC sp msforeachtable
  • 在 Robot 框架中的测试套件中设置会话 cookie

    我的应用程序是一个 RESTful API 仅当会话 cookie 存在时才有效 不幸的是 我总是需要在一个网页登录获取 cookie 并传递会话cookie到 API 来建立会话 我能够找出解决方案来验证会话 cookie 并将其传递给
  • 如何从命令行运行scala文件?

    scala是否支持scala run xxx scala go语言支持这样运行 go my go 并且Python支持 python my py 但看来 scala xxx scala 仅进行语法检查 未观察到任何输出或运行行为 那么有没有
  • 使用 NaN 计算 numpy 数组中的移动平均值

    我正在尝试计算包含 NaN 的大型 numpy 数组中的移动平均值 目前我正在使用 import numpy as np def moving average a n 5 ret np cumsum a dtype float ret n
  • 创建shell可执行全局节点模块

    我尝试创建节点模块 我成功了 我用了npm install g在代码目录中 它创建了这个模块文件夹 AppData Roaming npm node modules myfirstmodule 现在我想让一个文件作为命令可执行 例如 pm2
  • 您推荐使用哪些工具来分析 Rails 应用程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找 Rails 的分析工具 我目前正在玩和测试 ruby prof 和 Railsbench 但我对使其工作所需的大量调整和修改
  • JavaFX中如何获取鼠标位置?

    我是java fx 的初学者 如何在 JavaFX 中获取鼠标在 x 和 y 中的位置 我尝试使用 AWTMouseInfo 也导入了它 但它不起作用 我还在 Ensembles 中看到了它的代码 在 高级阶段 拖动球窗口 这就是我需要做的