当系统日期/时间更改为过去的日期/时间时,JavaFX会冻结

时间:2018-07-12 08:02:02

标签: java ubuntu javafx

我有一个奇怪的问题。我启动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)客户端VM(内部版本25.171-b11,混合模式)

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

2 个答案:

答案 0 :(得分:2)

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

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

如果“系统时间”倒退,则此TimerThread冻结。

我通过修改Monocle.java来调用修改后的Timer.java,并在jfxrt.jar中对其进行更新,从而解决了该问题

答案 1 :(得分:1)

花费大量时间搜索解决方案后,我找到了一个解决方案(我在RPibian Strech / Buster的RPi3上遇到问题,在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();