在 javafx 2 中通过拖动来移动节点的正确方法?

2024-03-10

我正在将具有大量自定义绘画的 Swing/Graphics2D 应用程序转换为 JavaFX2 应用程序。虽然我非常喜欢新的 API,但在绘制椭圆时,我似乎遇到了性能问题,我想在鼠标移动到鼠标光标下方时绘制椭圆。当我以稳定的方式(不是快得离谱)移动鼠标时,我注意到椭圆总是在鼠标轨迹后面几厘米处绘制,并且只有当我停止移动光标时才赶上。这是在只有少数节点的场景图中。在我的 Swing 应用程序中我没有遇到这个问题。

我想知道这是否是在鼠标光标所在位置绘制形状的正确方法?

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.EllipseBuilder;
import javafx.stage.Stage;

public class TestApp extends Application {
public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {
    Pane p = new Pane();

    final Ellipse ellipse = EllipseBuilder.create().radiusX(10).radiusY(10).fill(Color.RED).build();
    p.getChildren().add(ellipse);

    p.setOnMouseMoved(new EventHandler<MouseEvent>() {
        public void handle(MouseEvent event) {
            ellipse.setCenterX(event.getX());
            ellipse.setCenterY(event.getY());
        }
    });

    Scene scene = SceneBuilder.create().root(p).width(1024d).height(768d).build();
    primaryStage.setScene(scene);

    primaryStage.show();
}
}

小更新:我升级到 JavaFX 2.2 和 Java7u6(在 Windows 7 64 位上),但似乎没有什么区别。


这是我用来允许的一些代码Label http://docs.oracle.com/javafx/2/api/javafx/scene/control/Label.html被拖来拖去Pane http://docs.oracle.com/javafx/2/api/javafx/scene/layout/Pane.html。 我没有注意到鼠标轨迹有任何明显的滞后。

// allow the label to be dragged around.
final Delta dragDelta = new Delta();
label.setOnMousePressed(new EventHandler<MouseEvent>() {
  @Override public void handle(MouseEvent mouseEvent) {
    // record a delta distance for the drag and drop operation.
    dragDelta.x = label.getLayoutX() - mouseEvent.getSceneX();
    dragDelta.y = label.getLayoutY() - mouseEvent.getSceneY();
    label.setCursor(Cursor.MOVE);
  }
});
label.setOnMouseReleased(new EventHandler<MouseEvent>() {
  @Override public void handle(MouseEvent mouseEvent) {
    label.setCursor(Cursor.HAND);
  }
});
label.setOnMouseDragged(new EventHandler<MouseEvent>() {
  @Override public void handle(MouseEvent mouseEvent) {
    label.setLayoutX(mouseEvent.getSceneX() + dragDelta.x);
    label.setLayoutY(mouseEvent.getSceneY() + dragDelta.y);
  }
});
label.setOnMouseEntered(new EventHandler<MouseEvent>() {
  @Override public void handle(MouseEvent mouseEvent) {
    label.setCursor(Cursor.HAND);
  }
});

. . .

// records relative x and y co-ordinates.
class Delta { double x, y; }

这是一个小完整的示例应用程序 https://gist.github.com/2724651使用上面的代码。

Update上面的例子,当被拖动的对象很小时,仍然会滞后于光标后面被拖动的对象。

另一种方法是使用图像光标 http://docs.oracle.com/javafx/2/api/javafx/scene/ImageCursor.html由叠加在被拖动节点的图像表示上的 MousePointer 组成,然后在拖动开始和完成时隐藏和显示实际节点。这意味着节点拖动渲染不会滞后于光标(因为节点的图像表示现在是光标)。然而这种方法确实有缺点 => 对 ImageCursors 的大小和格式有限制,而且您需要将 Node 转换为 Image 以将其放入 ImageCursor 中,为此您可能需要高级 Node => 图像转换操作仅用于在 JavaFX 2.2+ 中可用。

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

在 javafx 2 中通过拖动来移动节点的正确方法? 的相关文章

  • Java Sqlite Gradle

    我对 gradle 和 java 还很陌生 我有一个使用 sqlite 的项目 它通过 intellij idea 运行良好 但我无法从终端运行它 它会抛出异常 java lang ClassNotFoundException org sq
  • 如何降低圈复杂度?

    我正在开发一个将 RequestDTO 发送到 Web 服务的类 我需要在发送请求之前验证该请求 请求可以从 3 个不同的地方发送 并且每个 请求类型 有不同的验证规则 例如请求1必须有姓名和电话号码 请求2必须有地址等 我有一个 DTO
  • 在哈希图中存储字符和二进制数

    我正在尝试存储字母到二进制数的映射 这是我的映射 h 001 i 010 k 011 l 100 r 101 s 110 t 111 为此 我创建了一个哈希映射并存储了键值对 我现在想显示给定句子的相应二进制值 这是我的代码 package
  • 以点作为分隔符分割字符串

    我想知道我是否要在一个字符串上分割字符串 正确的方式 我的代码是 String fn filename split return fn 0 我只需要字符串的第一部分 这就是我返回第一项的原因 我问这个是因为我在 API 中注意到 意味着任何
  • Maven 目标的默认阶段?

    据我了解 在 Maven 中 插件目标可以附加到生命周期阶段 如果没有定义 默认阶段是什么 根据我的经验 这取决于插件的目标 例如 组装 单个 http maven apache org plugins maven assembly plu
  • org.postgresql.util.PSQLException:协议错误。会话设置失败

    我知道这些类型的问题已经存在 但提供的解决方案对我不起作用 在我的应用程序中 没有版本不匹配的黑白驱动程序和 PostgreSQL 服务器 我还没有找到任何其他解决方案 我正在使用 PostgreSQL 服务器 9 4 和 postgres
  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • 通过 JNI 从 Applet 调用 DLL

    我有一个 概念验证 的作品 它跨越了一些不熟悉的领域 我的任务是将 EFTPOS 机器连接到在内联网浏览器中作为小程序运行的应用程序 我暂时忽略了 EFTPOS dll 并用我选择的语言 Delphi 创建了一个简单的 JNI 修饰的 DL
  • Hystrix是否可以订阅CircuitBreaker开启事件?

    对于单元测试 我希望能够订阅 Hystrix 事件 特别是在断路器打开或关闭时发生事件 我四处寻找示例 似乎解决方法是利用指标流并监视断路器标志 由于 Hystrix 是基于 RxJava 构建的 我认为应该在某个地方有一个事件订阅接口 在
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • 如何将txt文件添加到你的android项目中? [复制]

    这个问题在这里已经有答案了 我的Android studio版本是1 5 1 显然这个 never 版本没有 txt 文件的 asset 文件夹 您打算如何将这些文件包含到您的项目中 以及如何进一步使用您内部的应用程序 谢谢你的建议 Pro
  • Java 中 static 关键字如何工作?

    我正在阅读Java教程 http docs oracle com javase tutorial index html从一开始我就有一个问题static字段或变量上的关键字 作为Java said here http docs oracle
  • XSLT:我们可以使用abs值吗?

    我想知道在 XSLT 中我们是否可以使用 math abs 我在某处看到过这个 但它不起作用 我有类似的东西
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指
  • NoSuchMethodError:将 Firebase 与应用程序引擎应用程序集成时

    我试图将 firebase 实时数据库与谷歌应用程序引擎应用程序集成 我在调用时收到此错误 gt DatabaseReference ref FirebaseDatabase gt getInstance gt getReference t
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • BoneCP 和 Derby - 如何正确关闭

    I have BoneCP CONNECTION POOL CONNECTION POOL getConfig setJdbcUrl jdbc derby database shutdown true Connection connecti
  • SWT - 与操作系统无关的获取等宽字体的方法

    SWT 有没有一种方法可以简单地获得跨各种操作系统的等宽字体 例如 这适用于 Linux 但不适用于 Windows Font mono new Font parent getDisplay Mono 10 SWT NONE 或者我是否需要
  • 在多线程环境中,Collections.sort 方法有时会抛出 ConcurrentModificationException。列表没有进行结构性修改

    package CollectionsTS import java util ArrayList import java util Collections import java util HashSet import java util
  • RecyclerView 不调用 onCreateViewHolder 或 onBindView

    没有收到任何错误 所有数据似乎都有效 由于某种原因 没有调用与视图相关的方法 我已确定以下事项 getItemCount 是唯一被调用的适配器方法 并且返回一个正整数值 我知道这将是你们将要查看的区域 构造函数正在被调用 成员变量有效 Pa

随机推荐

  • UITextField 在视图出现后丢失firstResponder

    我有一个UIPageViewController 一个页面有一个按钮 另一页有一个UITextField有一个按钮 当页面滚动到带有字段的视图时 我希望它becomeFirstResponder并打开键盘 发生的情况如下 I call se
  • Outlook iCal 会议邀请说明问题

    我正在发送iCal event邀请使用php 一切都以正确的方式显示RVSP按钮正确显示 但description is cutting down after first line 例如 如果我的描述是 The problem occurs
  • JDK 1.6 中“vm 线程”的作用是什么[重复]

    这个问题在这里已经有答案了 我们在客户的系统中看到该线程的大量活动 因此想知道可能会发生什么 有链接 信息 教程吗 P S 这种情况发生在带有 JDK 1 6 0 23 的 Solaris 10 上 该线程将为您提供一些继续操作的步骤 如果
  • 了解 z3 模型

    Z3Py 片段 x Int x fun Function fun IntSort IntSort IntSort phi ForAll x fun x x x print phi solve phi 永久链接 http rise4fun c
  • 关闭申请

    关闭 C 应用程序时的最佳实践是什么 我读到您可以使用 Environment Exit 0 or Application Exit 但有什么区别呢 此外 关于Environment Exit 0 我以前在使用Java时使用过退出代码 但从
  • Javascript - 在另一个数组中插入一个数组

    将一个数组插入另一个数组的更有效方法是什么 a1 1 2 3 4 5 a2 21 22 newArray a1 insertAt 2 a2 gt 1 2 21 22 3 4 5 如果 a2 数组很大 从性能角度来看 使用 splice 迭代
  • 有没有办法触发Maven Appengine Devserver自动刷新静态文件?

    最新版本的maven插件已经实现了每5秒更新一次代码 这是一个很大的进步 但除非我配置错误 否则它似乎不会获取静态文件更改 例如连接到 appengine 代码的正在进行的 Javascript 有什么方法可以改变这种行为 还是我只需要等待
  • 添加 VirtualHost 失败:访问禁止错误 403 (XAMPP) (Windows 7)

    我已经在 Windows 7 上运行了 XAMPP 安装 一旦我将 VirtualHost 添加到 httpd vhosts conf 两者都是 常规 http localhost和新的dropbox local不工作 这是我添加到我的ht
  • 在 DAX 中进行测量以计算仅适用于 Power BI 的选定月份的年初至今

    如何构建 DAX 度量来计算特定月份的 YTD 值总和 这里我们有按月份分组的事实表 FactTable 填充了实际数据和预测数据 了解实际结束时间的唯一方法是 截止日期 列 年初至今 中的信息 在表 截止日期 列 YTD 结束 中 这是一
  • 如何使用 Apps 脚本使用预设选项填充 HTML 表列之一?

    我试图让这个表显示每个表行的选项 但我不太明白 我想我会把它设置在第二个for loop 但我是新手html并且无法前进
  • 在 ggplot2 中对 x 轴日期值进行排序

    我有以下数据集 正如你所看到的 我有两周的一些定量数据 我想对它们的日子进行比较 即 星期一 09 和星期一 10 week date day n chr date chr int 1 Week 09 2016 02 29 Monday 5
  • 如何在matlab中隐藏轴和刻度而不隐藏其他所有内容

    我在 matlab UI 中将图像绘制到轴上 但我不希望轴和刻度线可见 如何防止这种情况发生 以及在哪里进行此调用 我这样做 imagesc myImage parent handles axesInGuide axis off 这是你想要
  • 如何在 Sinatra 代码中发出 POST 请求?

    单击表单中的按钮将发送一个 POST 请求 由以下代码段处理 post register do send post request to http www randomsite com parse response do something
  • JS async/await - 为什么await需要异步?

    为什么使用await需要声明其外部函数async 例如 为什么这个 mongoose 语句需要它所在的函数来返回一个承诺 async function middleware hostname done try let team await
  • MPMediaItem 未使用 MPMediaItemPropertyAssetURL 在 AVAudioPlayer 中播放

    我有这段代码 用于查找并播放 MPMediaItem MPMediaPropertyPredicate predicate MPMediaPropertyPredicate predicateWithValue self persisten
  • 注册自定义单元格时不调用prepareForSegue

    这不是 Segue 标识符拼写错误或类似问题 方法prepareForSegue当我点击表视图控制器中的单元格时 实际上并没有被调用 如果我点击单元格 则仅当我添加新单元格时 控制语句之前的日志语句才不会记录 void prepareFor
  • 1/252 = 0 在 C# 中?

    我正在做计算 在调试时我发现了这个 double num 1 252 当我调试它时 数字设置为零 0 是否有一个原因 我想将其作为实际计算 Thanks 是 该计算正在执行integer算术 尝试这个 double num 1 0 252
  • JavaScript Chrome 扩展 - 从弹出窗口到内容创建新选项卡后发送消息

    在我的扩展的 popup js 中 我想创建一个新选项卡并发送一条消息 content js 必须监听消息并回答 但它不起作用 我尝试了很多在其他问题中找到的解决方案 但没有成功 这是我的文件 Manifest json name Stam
  • 嵌入导航控制器

    我刚刚将 Xcode 从 4 2 更新到 4 3 3 但我不断遇到问题 是否可以在单视图应用程序中添加导航控制器 因为当我尝试将导航控制器嵌入到控制器中时 什么也没有发生 我希望有两个视图控制器通过按钮连接到第二个控制器 并通过导航栏连接到
  • 在 javafx 2 中通过拖动来移动节点的正确方法?

    我正在将具有大量自定义绘画的 Swing Graphics2D 应用程序转换为 JavaFX2 应用程序 虽然我非常喜欢新的 API 但在绘制椭圆时 我似乎遇到了性能问题 我想在鼠标移动到鼠标光标下方时绘制椭圆 当我以稳定的方式 不是快得离