JavaFX 冻结问题

2024-01-04

我正在摆弄 JavaFX API,由于某种原因,这个应用程序似乎在(看似)随机的时间后冻结了。

它是一个制作红绿渐变图案的应用程序,并且有一个很酷的动画与之配合。当应用程序运行时,按 Enter 键,动画就会开始。一段时间后(就像我之前所说的那样,似乎是随机的)它将停止更新,但计时器继续运行,循环也是如此,并且仍然使用正确的参数调用 setColor 方法,这让我认为要么PixelWriter 被冻结或窗口未更新。

我所做的代码如下:

package me.dean;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.PixelWriter;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.util.Timer;
import java.util.TimerTask;
public class DeansApp extends Application {
    CoolAnimation canvas;

    @Override
    public void start(Stage primaryStage) throws Exception {
        canvas = new CoolAnimation();
        canvas.setWidth(255);
        canvas.setHeight(255);
        primaryStage.setScene(new Scene(new Pane(canvas)));
        canvas.getScene().setOnKeyPressed(event -> {
            if(event.getCode().equals(KeyCode.ENTER)) {
                canvas.play ^= true;
            }
        });

        primaryStage.setOnCloseRequest(event -> System.exit(0));
        primaryStage.show();
    }

    private class CoolAnimation extends Canvas {
        boolean play;
        int column = 0;
        boolean coloring = true;

        public CoolAnimation() {
            super();

            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    if(CoolAnimation.this.play) {
                        GraphicsContext g = getGraphicsContext2D();
                        if(g != null) {
                            PixelWriter writer = g.getPixelWriter();
                            if(writer != null) {
                                for (int x = Math.min(255, column),
                                     y = Math.max(0, column - (int) CoolAnimation.this.getWidth());
                                     x >= 0 && y<=255;
                                     x--, y++) {
                                    writer.setColor(x, y, coloring ? Color.rgb(x, y, 0) : Color.WHITE);
                                }
                            }
                        }
                        column++;
                        if(column >= CoolAnimation.this.getWidth() * 2) {
                            coloring ^= true;
                            column = 0;
                        }
                    }
                }
            }, 0L, 10L);
        }
    }
}

非常感谢任何能够提供帮助的人!


你想使用一个动画定时器 http://blog.netopyr.com/2012/06/14/using-the-javafx-animationtimer/ or Timeline https://docs.oracle.com/javase/8/javafx/api/javafx/animation/Timeline.html, not a java.util.Timer https://docs.oracle.com/javase/8/docs/api/java/util/Timer.html。 AnimationTimer 或 Timeline 在 JavaFX 应用程序线程上执行其代码,而 java.util.Timer 则不会。使用 java.util.Timer 您将遇到与线程竞争条件相关的随机问题。您可以使用平台.runLater https://docs.oracle.com/javase/8/javafx/api/javafx/application/Platform.html#runLater-java.lang.Runnable-与 java.util.Timer 结合使用,但一般来说,使用 AnimationTimer 是处理此问题的首选方法。

查看相关问题:

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

JavaFX 冻结问题 的相关文章

随机推荐

  • 将 JDialog 置于父级之上

    我有一个 Java swing 应用程序 带有一个按钮 当执行某个操作时 该按钮会生成一个弹出窗口 我想在渲染时将弹出窗口的中心点与父窗口的中心点对齐 如何计算要插入的 x y 坐标setLocation 对于弹出窗口 只是为了澄清 我不想
  • ASP.net MVC Webforms 视图引擎的缺点?

    我目前正在计划一个基于 MVC 的新项目 现在 有几种不同的视图引擎 我只是想知道 Webforms 引擎的缺点是什么 值得进行切换 有些人觉得真强 http twitter com codinghorror statuses 151572
  • 什么 XPath 从表中选择奇数 TR(从第三个开始)?

    我有一张桌子 table tr td 1 td tr tr td 2 td tr tr td 3 td tr tr td 4 td tr tr td 5 td tr tr td 6 td tr tr td 7 td tr tr td 8 t
  • 为什么在枚举类中阻止默认序列化[重复]

    这个问题在这里已经有答案了 我一直在网络上搜索一些与java中枚举类相关的查询的答案 我的疑问是为什么枚举类中默认的反序列化被阻止 我可以看到枚举类实现了 Serialized 接口 但它也有以下 2 个方法 private void re
  • CSS按钮按下效果[重复]

    这个问题在这里已经有答案了 我有一个带有框阴影的按钮 使其看起来像是浮动的 我想在单击它时产生按压效果 代码 CSS startBtn font family OpenSans color FFFFFF background color 0
  • 获取“最佳”lambda 处的 glmnet 系数

    我在 glmnet 中使用以下代码 gt library glmnet gt fit glmnet as matrix mtcars 1 mtcars 1 gt plot fit xvar lambda 然而 我想打印出最好的 Lambda
  • 正则表达式删除ruby中url的网页部分

    我正在尝试删除 URL 的网页部分 例如 www example com home index html to www example com home 任何帮助表示赞赏 Thanks 尽可能不使用正则表达式可能是个好主意 你可以召唤克苏鲁
  • 当用户离开页面时在 angularjs 中显示警报

    我是 AngularJS 的新蜜蜂 我正在尝试编写一个验证 当用户尝试关闭浏览器窗口时提醒用户 我的页面 v1 和 v2 上有 2 个链接 单击链接时 它会转到特定页面 这是重定向到 v1 和 v2 的代码 angular module m
  • 如何在迭代时从列表中删除项目?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我正在迭代 Python 中的元组列表 并尝试在它们满足某些条件时将其删除 for tu
  • Hibernate ManyToMany 在更新时出现连接表问题

    我正在尝试使 ManyToMany 关联适用于所有 CRUD 操作 我有两个实体 Places and Events 一个地方可以举办多个活动 一个活动可以在多个地方举行 在第一种情况下我有 在 PlaceDto 类中 ManyToOne
  • 更新mysql中的序列化数组(不进行反序列化?)

    我读过的所有内容都说在 Mysql 中存储序列化数组是一个坏主意 我已经知道了 不幸的是 我正在使用使用此方法的开源脚本 并且在这种情况下更改结构不是一个选项 是否可以在不先反序列化的情况下更新此 URL 我最初尝试使用替换 但它抛出一个错
  • nio中服务器不接受多个客户端

    我正在尝试构建一个聊天应用程序 我有一个将数据从客户端发送到服务器的代码 当一个或多个客户端登录时 当客户端程序运行一次或多次时 服务器将不接受除第一次连接之外的其余连接 请帮我解决这个问题 这是我的代码 public class Serv
  • JavaScript 不加载 WordPress 页脚

    我最近开始学习Javascript 我正在尝试将一个小脚本添加到我的 WordPress 网站页面的页脚中 我正在使用 插入页眉和页脚 插件 但是 该脚本似乎未加载 我不认为这是语法问题 因为类似的脚本可以在不同的站点上运行 但是 我无法弄
  • 如何解决android中添加内容之前必须调用requestFeature()

    我正在创建一个应用程序 其中包含当我们单击按钮时在警报对话框中弹出的简单而小的注册表单 但它显示了一个名为的错误android util AndroidRuntimeException 添加内容之前必须调用 requestFeature 请
  • Go 中的 var 与 :=

    在此处的 Go Web 服务器示例中 http golang org doc effective go html web server http golang org doc effective go html web server 以下代
  • 同一 Ubuntu 机器上的多个 Python 版本

    我在 Ubuntu 机器上 自动安装了 Python 3 10 为了在共享代码库中执行给定任务 我需要使用 Python 3 9 来解决新版本的一些问题 我希望在我的机器上安装这两个Python 并且能够使用这两个Python 并在需要时进
  • Xcode4 显示所有输出(删除“仅显示前 200 个通知”)

    Apple在Xcode4最新版本中添加了新bug 如果输出超过200行 则全部删除 显然 如果有输出 那么它的存在是有原因的 我需要看到它 我尝试寻找首选项 GUI 或按钮 但找不到任何内容 他们肯定没有对其进行硬编码以防止您看到自己的输出
  • 使用 Node.js 进行 SOAP 请求

    嗨 任何人都可以帮助我吗 如何请求 SOAP Web 服务并获取 xml 响应 塞纳里奥 使用soap ui 我发送带有用户名 密码身份验证的wsdl url 并且我还将发送soap xml数据 然后我会得到响应 如何使用 Nodejs 或
  • 如何将 Either 转换为 MonadThrow

    我有一个通过处理错误的函数Either funErrViaEither a gt Either SomeException b 我想在另一个应该更灵活并返回的函数中使用这个函数MonadThrow m funErrViaThrow Mona
  • JavaFX 冻结问题

    我正在摆弄 JavaFX API 由于某种原因 这个应用程序似乎在 看似 随机的时间后冻结了 它是一个制作红绿渐变图案的应用程序 并且有一个很酷的动画与之配合 当应用程序运行时 按 Enter 键 动画就会开始 一段时间后 就像我之前所说的