【问题标题】:JavaFX freezes when the system date/time changed to a day/time in the past当系统日期/时间更改为过去的一天/时间时,JavaFX 冻结
【发布时间】:2018-12-20 08:51:42
【问题描述】:

我有一个奇怪的问题。我启动了我的 JavaFX 程序,该程序使用通过套接字发送的命令在屏幕上绘制对象(矩形、圆形等)。向后更改系统时钟时(例如,在 11:00 更改为 9:00),JavaFX 不显示执行命令的结果(即创建的对象),后台的程序逻辑工作并在控制台中打印消息收到并执行的命令,但屏幕上不显示任何内容。 时间由命令改变:

sudo date --set 'time' && sudo hwclock --systohc

操作系统是 Ubuntu 16.04.4 LTS,内核版本为 3.4.39-s5p4418。此操作系统适用于 Smart4418 模块。

uname -a 输出:

Linux 4418Module 3.4.39-s5p4418 #1 SMP PREEMPT Fri Aug 18 14:06:20 HKT 2017 armv7l armv7l armv7l GNU/Linux

Java 版本:

java版本“1.8.0_171”
Java(TM) SE 运行时环境(内部版本 1.8.0_171-b11)
Java HotSpot(TM) 客户端虚拟机(内部版本 25.171-b11,混合模式)

我使用的JavaFX Embedded SDK是从Gluon's website下载的。

【问题讨论】:

标签: java ubuntu javafx


【解决方案1】:

jfxrt.jar 中的 Monocle.java 使用 java/util/Timer.java(JDK1.8) 管理屏幕。

TimerThread(JDK1.8) 中的方法“MainLoop”使用“systemtime”计算执行时间。

如果“系统时间”倒退,这个 TimerThread 将冻结。

我通过修改 Monocle.java 以调用修改后的 Timer.java 并在 jfxrt.jar 中更新它们来修复它

【讨论】:

  • 你能分享你的解决方案吗,@user10384350?
  • 我有完全相同的问题。后台逻辑(甚至按下 UI 按钮)正在运行,但屏幕上没有任何变化。你能分享你的解决方案吗?
  • 如果其他人遇到此问题,请注意 MonocleTimer.java 已在 JavaFX 的较新版本中进行了更新,以解决 Timer 问题。这是相应的错误报告。 bugs.java.com/bugdatabase/view_bug.do?bug_id=8176499
【解决方案2】:

在花了很多时间搜索解决方案后,我找到了一个(我在 RPi3 上的 Raspbian Strech/Buster 上遇到问题,在 Windows 10 上一切正常)。我向我的一个组件(可以隐藏)添加了“假”动画,现在更改系统时间时 UI 不会冻结。在我找到更好的解决方案之前,这只是一种解决方法。

final Rotate fakeRotate = new Rotate();
    backButton.getTransforms().add(fakeRotate);

    fakeAnimation = new Timeline(
            new KeyFrame(
                    Duration.hours(24),
                    new KeyValue(
                            fakeRotate.angleProperty(),
                            0.1,
                            Interpolator.LINEAR
                    )
            )
    );

    fakeAnimation.setCycleCount(Animation.INDEFINITE);
    fakeAnimation.play();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多