首页
学习
活动
专区
圈层
工具
发布

在javafx中移动形状?

JavaFX 中移动形状的完整指南

基础概念

在 JavaFX 中移动形状涉及图形编程的基本概念。JavaFX 提供了多种方式来控制和动画化场景图中的节点(包括形状)。

移动形状的方法

1. 直接修改坐标属性

最简单的方法是直接修改形状的坐标属性:

代码语言:txt
复制
Circle circle = new Circle(50, 50, 30);
// 移动圆形
circle.setCenterX(100);
circle.setCenterY(100);

2. 使用 TranslateTransform

更推荐的方法是使用平移变换(TranslateTransform),因为它不会改变形状的原始位置,只是改变其视觉呈现:

代码语言:txt
复制
Rectangle rect = new Rectangle(50, 50, 100, 100);
TranslateTransform translate = new TranslateTransform();
rect.getTransforms().add(translate);

// 移动矩形
translate.setX(50);
translate.setY(50);

3. 使用 Timeline 动画

要实现平滑的移动动画,可以使用 Timeline:

代码语言:txt
复制
Circle circle = new Circle(50, 50, 30);
TranslateTransform translate = new TranslateTransform();
circle.getTransforms().add(translate);

Timeline timeline = new Timeline(
    new KeyFrame(Duration.ZERO, new KeyValue(translate.xProperty(), 0)),
    new KeyFrame(Duration.seconds(2), new KeyValue(translate.xProperty(), 200))
);
timeline.play();

4. 使用鼠标拖拽

实现鼠标拖拽移动形状:

代码语言:txt
复制
Circle circle = new Circle(50, 50, 30);
final double[] offset = new double[2];

circle.setOnMousePressed(event -> {
    offset[0] = circle.getCenterX() - event.getSceneX();
    offset[1] = circle.getCenterY() - event.getSceneY();
});

circle.setOnMouseDragged(event -> {
    circle.setCenterX(event.getSceneX() + offset[0]);
    circle.setCenterY(event.getSceneY() + offset[1]);
});

优势比较

| 方法 | 优势 | 适用场景 | |------|------|----------| | 直接修改坐标 | 简单直接 | 简单位置调整 | | TranslateTransform | 保留原始坐标,便于计算 | 需要频繁移动的场景 | | Timeline 动画 | 平滑过渡 | 需要动画效果 | | 鼠标拖拽 | 交互性强 | 需要用户交互 |

常见问题及解决方案

问题1:形状移动后边界检测不准确

原因:直接修改坐标时,边界检测可能基于原始位置而非当前位置。

解决:使用 localToScene 方法转换坐标:

代码语言:txt
复制
Bounds bounds = shape.localToScene(shape.getBoundsInLocal());

问题2:多个变换叠加导致意外行为

原因:多次添加变换可能导致不可预测的结果。

解决:清除旧变换或使用单一变换:

代码语言:txt
复制
shape.getTransforms().clear();
shape.getTransforms().add(new TranslateTransform(x, y));

问题3:动画性能问题

原因:复杂动画可能导致性能下降。

解决

  • 使用硬件加速:scene.setCache(true);
  • 简化动画复杂度
  • 使用 AnimationTimer 替代 Timeline 进行复杂动画

高级应用示例

沿路径移动

代码语言:txt
复制
Path path = new Path();
path.getElements().add(new MoveTo(50, 50));
path.getElements().add(new CubicCurveTo(100, 0, 150, 100, 200, 50));

PathTransition pathTransition = new PathTransition();
pathTransition.setDuration(Duration.seconds(5));
pathTransition.setPath(path);
pathTransition.setNode(circle);
pathTransition.play();

物理引擎集成

对于更复杂的移动(如重力、碰撞等),可以集成物理引擎如 JBox2D:

代码语言:txt
复制
// 初始化物理世界
World world = new World(new Vec2(0, 9.8f));

// 创建物理体
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
bd.position.set(50, 50);
Body body = world.createBody(bd);

// 同步物理体和 JavaFX 形状
AnimationTimer timer = new AnimationTimer() {
    @Override
    public void handle(long now) {
        world.step(1/60f, 6, 2);
        circle.setCenterX(body.getPosition().x);
        circle.setCenterY(body.getPosition().y);
    }
};
timer.start();

总结

JavaFX 提供了多种灵活的方式来移动形状,从简单的坐标修改到复杂的动画和物理模拟。选择合适的方法取决于具体需求,简单交互可以直接修改坐标,复杂动画推荐使用变换和动画 API,而需要物理效果则可以集成第三方物理引擎。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

在ORACLE中移动数据库文件

在ORACLE中移动数据库文件 --ORACLE数据库由数据文件,控制文件和联机日志文件三种文件组成。...移动控制文件: -- 控制文件 在 INIT.ORA文件中指定。移动控制文件相对比较简单,下数据库, -- 编辑INIT.ORA,移动控制文件,重启动数据库。 STEP 1....编辑INIT.ORA文件: INIT.ORA文件的在$ORACLE_HOME/dbs目录下, 修改参数 "control_files",其中指定移动后的控制文件: control_files = (/...在Oracle中的存放位置,采用不同的方式来告诉Oracle:"偶已将原文件移动到另一个地方了"....中所做操作就得在PHASE3真正open这些文件之前,告诉Oracle(因为信息记录在control file中,所以又得在PHASE2中,control file被open后做),偶们已改了file

1.6K50

Atom飞行手册翻译: 2.2 在Atom中移动

在Atom中移动 用鼠标和方向键,简单地在Atom中移来移去非常容易,然而Atom有一些快捷键,可以让你把手一直放到键盘上,更快速地浏览文档。 首先,Atom自带许多Emacs的快捷键来浏览文档。...如果你在Mac中使用Homebrew,运行brew install ctags来安装。 你可以通过在你的主目录下生成.ctags文件(~/.ctags),来自定义tags如何生成。这里是一个例子。...Atom书签 Atom同时拥有一个非常棒的途径,在特定的一行上面加上书签,使你可以快速跳到那一行。 如果你按下cmd-F2,Atom会给那一行加上书签。...你可以在整个项目中设置一些书签,并且使用它们快速跳到项目中一些重要的行。一个小的书签标识会加在行号后面,像下面这张图的第22行。 按下F2之后,Atom会跳到当前文件的下一个书签的位置。

1.3K20
  • 在形状中放置单元格内容,让形状中的文字变化起来

    excelperfect 标签:Excel技巧 有时,我们不希望在形状中只是使用静态文本,例如想要显示计算的结果,该如何操作? 很简单! 如图1所示,想要在圆中显示动态的时间。...图1 选择形状圆,单击公式栏,输入=A1。按下回车键,此时单元格A1中的值就会显示在圆中。当更新单元格A1中的值时,形状圆中的值也会跟着更新。如下图2所示。...假设想在某形状中显示列表值之和。并且形状在工作表的第1行到第4行中显示。可以这样操作: 1.将形状移开,并在单元格C2中建立一个公式来包含形状中的文本。...公式可能是: ="今天的总计: " & CHAR(10) & TEXT(SUM(A1:A6), "¥#,##0") 2.然后将形状移回原位,选择该形状并输入公式:=C2,设置适当的格式,结果如下图3所示...图3 注意,这种方法设置的形状中文本的更新仅当工作表重新计算时才更新。 假设在图表中添加了一个形状,如果希望形状中的文本来自单元格,则必须在单元格引用之前加上工作表名称。例如,=Sheet1!

    97010

    Excel技巧:在工作表中绘制完美的形状

    如果开始在单元格的左上角绘制矩形,形状将从该角开始。但是,如果在同一个点开始画一个圆,画的椭圆将不会完全包含单元格中的文本。此外,为什么没有圆形和正方形?有朋友觉得很难画出完美的圆形和正方形。...使用键盘键可以使绘制形状更加容易。 首先,要使椭圆成为一个完美的圆形,在绘制时要按住Shift键。使用Shift键还将强制矩形为正方形,强制三角形为等边三角形。 其次,圆形或椭圆形很难画。...为了在一个单元格周围绘制一个圆圈,必须从单元格外很远的地方开始。怎么知道要从多大程度上超出你的数据才能包括所有数据?一种解决方案是在绘制椭圆时按住Ctrl键(或按住Ctrl+Shift键绘制圆)。...如果要调整正方形的大小,在拖动角控制柄的同时按住Shift键,这将强制Excel保持纵横比不变。 如果需要制作许多大小相同的正方形,按住Ctrl键并拖动第一个正方形以制作相同的副本。

    86110

    【IoT迷你赛】在中移动标准板上利用tos实现GPS追踪器

    而最近正好从中移动手里薅了一个标准开发板(如下图),上面自带GSM模组M6312,就想着把tos搞到这个开发板上来利用,M6312接入网络来实现地理位置上报。...[uii3kdtsap.png] 移植的过程中除了搞定tos在MAC系统的STM32CubeIDE上的编译问题外,最大的一个麻烦就是当前开发库还不支持M6312,所以只能自己动手现撸一个。...期间遇到的一个坑是在接收数据的过程中,除了你要获取完所有的数据外,额外的数据也必需清理干净,这个问题我搞了很久。...现说明如下: M6312在收到数据后返回的格式如下: \r\nDATA\r\nOK\r\n 其中4是数据长度,也就是说按上例,在跳过"\r\n"后收完4字节数据"DATA"后还余下...在管理平台创建一个GPS产品,创建两个设备,一个名叫ChinaMobileStandardBoard对应该中移动开发板,一个叫Server,它的作用见后文。

    1.2K100

    使用Java在Netbeans IDE上开发JavaFX的4个深坑总结,开发必看!

    本来想着在netbeans上面开发Javafx项目很容易,也就没怎么准备,就直接上手了。后来气的我想砸键盘。由于现在大家普遍都使用eclipse和idea,导致这两个ide的教程普遍的多。...netbeans就不支持ant javafx项目的创建,r了我们直接创建普通的ant项目即可。...libraries点击 new library...为这个libray起个名字 比如 openjavafx-19上面点击完ok之后,是这个界面,接下来我们点击 add jar_folder第二个深坑:在弹出的窗口中选择我们要导入的...demo可以看到这个文档全部报错,是因为jar包不存在的缘故也就是找不到类接下来我们在 libraries 上右键 点击 add library...找到我们刚刚创建的library openjfx-...提示缺少java运行时组件,第三个深坑:这个问题的原因是因为 要添加一些参数 (它非常关键):--module-path “你的javafx lib路径” –add—modules javafx.controls.javafx.fxml

    3.3K00

    dotnet OpenXML 读取 PPT 形状边框定义在 Style 的颜色画刷

    本文来和大家聊聊在 PPT 形状使用了 Style 样式的颜色画刷读取方法 在开始之前,期望大家已了解如何在 dotnet 应用里面读取 PPT 文件,如果还不了解读取方法,请参阅 C# dotnet...Office 的 PowerPoint 添加默认的形状,在没有更改形状的填充和轮廓,形状使用的是默认的样式,如以下的默认矩形定义 <p:cNvPr id=...也就是说读取顺序如下 形状的 a:ln 定义的颜色 形状的样式的 a:lnRef 引用的主题的颜色 形状继承的样式 以上的测试文档是属于在形状的 a:ln 没有定义的颜色,而在形状的样式的 a:lnRef...里面定义的颜色,而且形状引用样式里面使用的是 占位符颜色 如果在形状的 a:ln 和形状的样式的 a:lnRef 没有定义的颜色,只有在形状的样式的...或者说在形状的 a:ln 没有定义的颜色,而在形状的样式的 a:lnRef 里面有定义颜色,但是形状的样式的 a:lnRef 引用的主题的颜色不是 phClr (PlaceholderColor, a

    1.3K20

    Texturify:基于 GAN在 3D 形状表面上生成高质量纹理! 论文速递2022.8.30!

    ECCV2022论文和代码整理:https://github.com/DWCTOD/ECCV2022-Papers-with-Code-Demo 最新成果demo展示: Texturify:基于 GAN在...由于纹理 3D 形状的可用性仍然非常有限,因此学习基于 3D 输入预测纹理的 3D 监督数据驱动方法非常具有挑战性。...因此,我们提出了 Texurify,这是一种基于 GAN 的方法,它利用对象类的 3D 形状数据集,并通过生成高质量纹理来学习重现在真实图像中观察到的外观分布。...特别是,我们的方法不需要任何 3D 颜色监督或形状几何和图像之间的对应来学习 3D 对象的纹理。...Texurify 通过在分层 4-RoSy 参数化上引入面部卷积算子直接在 3D 对象的表面上操作,以生成合理的对象特定纹理。

    58050

    如何使用MapTool构建交互式地牢RPG 【Gaming】

    通过使用MapTool,游戏大师的大部分工作在RPG开始之前就完成了。...更新JavaFX MapTool需要JavaFX,但是Java维护人员最近停止在Java的下载中捆绑它。这意味着,即使安装了Java,也可能没有安装JavaFX。...一些发行的Linux版本提供了JavaFX包,因此如果您试图运行MapTool并获得有关JavaFX的错误,请下载最新的自包含版本: 对于 基于Ubuntu and other Debian的系统 对于...可以以矩形块、椭圆、多边形、菱形和徒手画形状显示地图的各个部分。选定形状后,在地图上单击并释放,拖动它以定义要显示的区域,然后再次单击。...有几种基本形状可用,包括基本矩形和椭圆形。在所有的实心墙、门、柱子和其他障碍物上画出这些形状,你就立刻有了基本的物理知识。

    5.1K60

    JavaFX入门(四):JavaFX布局(一)

    布局控件我们在界面上一般是看不到的,它一个容器用于放置其它可视的界面元素控件。(JavaFX在线API文档:JavaFX8 API Online) JavaFX布局控件的类图如下: ?...默认情况下,控件均匀分布在Grid或者说Table中。但是我们可以指定一个控件所占的行列,让其跨行和列分布。...比如说我们要将一个Button放置在左下角,离右边100px,离下边100px的位置,我们便可以使用AnchorPane控件。...在SceneBuilder中我们可以很容易在右边的属性面板中设置锚定的方位和距离: ? 比如我们在左上角和右下角放置两个Button,如图: ?...在我们用SceneBuilder设计界面的时候,自动生成的FXML文件中的实体元素和属性是和JavaFX中的类和属性是对应的,我们可以通过FXML了解对应类的一些属性和方法。

    13K42

    javafx的使用原理是什么?javafx与java有什么不同?

    在生活中人们接触java比较多,很多人却不知道javafx是什么。...javafx是一种编程语言,使用这种语言能够开发丰富的网络程序,目前javafx包括两种类别,一种是javafx脚本,另一种是javafx mobile(可以运行于手机等移动设备),在以后的发展中,javafx...那么javafx的使用原理是什么?javafx与java有什么不同? image.png 一、javafx的使用原理是什么?...在javafx这种编程语言中,属性表示为形掺和返回值,目标类中的类则表示为类的成员参数与成员参数操作本身。“this”表示目标的属性名称,“return”则代表返回值的属性名称。...以上就是javafx的使用原理。 二、javafx与java有什么不同?

    5.4K30
    领券