Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JavaFX时钟小部件随机抛出异常

JavaFX时钟小部件随机抛出异常
EN

Stack Overflow用户
提问于 2016-02-26 03:34:19
回答 1查看 253关注 0票数 1

我编写了一个扩展Text类JavaFX的小时钟Widget。为了更新时间,我使用了一个基本上将文本设置为当前系统时间的Task。当我在Eclipse中运行这个应用程序时,它有时会在我称为NullpointerException的行中抛出一个stage.show()

这就是我的小部件源代码的样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package clock;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import javafx.concurrent.Task;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

public class CurrentClockText extends Text {
    private final DateTimeFormatter formatter;

    public static final int HOUR = 1;
    public static final int HOUR_MINUTE = 2;
    public static final int HOUR_MINUTE_SECOND = 3;
    public static final int HOUR_MINUTE_SECOND_MILLISECOND = 4;

    private final long updateInterval;

    private final Task<Void> updater = new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            while (true) {
                LocalDateTime now = LocalDateTime.now();
                String nowTextual = formatter.format(now);
                setText(nowTextual);

                try {
                    Thread.sleep(updateInterval);
                } catch (InterruptedException ignore) {
                }
            }
        }
    };

    public CurrentClockText() {
        this(HOUR_MINUTE);
    }

    public CurrentClockText(final int detailLevel) {
        String timeFormat = "";
        switch (detailLevel) {
        case HOUR:
            timeFormat = "HH";
            updateInterval = 60000;
            break;
        case HOUR_MINUTE:
            timeFormat = "HH:mm";
            updateInterval = 15000;
            break;
        case HOUR_MINUTE_SECOND:
            timeFormat = "HH:mm:ss";
            updateInterval = 500;
            break;
        case HOUR_MINUTE_SECOND_MILLISECOND:
            updateInterval = 1;
            timeFormat = "HH:mm:ss.S";
            break;
        default:
            throw new IllegalArgumentException(
                    "Unknown detail level for Clock: " + detailLevel);
        }

        setFont(new Font("Verdana", 28));

        formatter = DateTimeFormatter.ofPattern(timeFormat);
        Thread updaterThread = new Thread(updater, "CurrentClockText.updaterThread");
        updaterThread.setDaemon(true);
        updaterThread.start();
    }
}

这是主要的课程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package clock;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Boot extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        BorderPane pane = new BorderPane();

        CurrentClockText clock = new CurrentClockText(4);
        pane.setCenter(clock);

        Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        Boot.launch(args);
    }

}

这就是堆栈轨迹:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(Unknown Source)
    at com.sun.javafx.application.LauncherImpl$$Lambda$50/14845382.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
    at com.sun.javafx.text.PrismTextLayout.addTextRun(Unknown Source)
    at com.sun.javafx.text.GlyphLayout.addTextRun(Unknown Source)
    at com.sun.javafx.text.GlyphLayout.breakRuns(Unknown Source)
    at com.sun.javafx.text.PrismTextLayout.buildRuns(Unknown Source)
    at com.sun.javafx.text.PrismTextLayout.layout(Unknown Source)
    at com.sun.javafx.text.PrismTextLayout.ensureLayout(Unknown Source)
    at com.sun.javafx.text.PrismTextLayout.getBounds(Unknown Source)
    at javafx.scene.text.Text.getLogicalBounds(Unknown Source)
    at javafx.scene.text.Text.impl_computeLayoutBounds(Unknown Source)
    at javafx.scene.Node$12.computeBounds(Unknown Source)
    at javafx.scene.Node$LazyBoundsProperty.get(Unknown Source)
    at javafx.scene.Node$LazyBoundsProperty.get(Unknown Source)
    at javafx.scene.Node.getLayoutBounds(Unknown Source)
    at javafx.scene.Node.prefWidth(Unknown Source)
    at javafx.scene.Node.minWidth(Unknown Source)
    at javafx.scene.layout.Region.computeChildPrefAreaWidth(Unknown Source)
    at javafx.scene.layout.BorderPane.getAreaWidth(Unknown Source)
    at javafx.scene.layout.BorderPane.computePrefWidth(Unknown Source)
    at javafx.scene.Parent.prefWidth(Unknown Source)
    at javafx.scene.layout.Region.prefWidth(Unknown Source)
    at javafx.scene.Scene.getPreferredWidth(Unknown Source)
    at javafx.scene.Scene.resizeRootToPreferredSize(Unknown Source)
    at javafx.scene.Scene.preferredSize(Unknown Source)
    at javafx.scene.Scene.impl_preferredSize(Unknown Source)
    at javafx.stage.Window$9.invalidated(Unknown Source)
    at javafx.beans.property.BooleanPropertyBase.markInvalid(Unknown Source)
    at javafx.beans.property.BooleanPropertyBase.set(Unknown Source)
    at javafx.stage.Window.setShowing(Unknown Source)
    at javafx.stage.Window.show(Unknown Source)
    at javafx.stage.Stage.show(Unknown Source)
    at clock.Boot.start(Boot.java:19)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(Unknown Source)
    at com.sun.javafx.application.LauncherImpl$$Lambda$53/19600960.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$45/18503843.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/27167109.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$47/2180324.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/3326003.run(Unknown Source)
    ... 1 more
Exception running application clock.Boot

正如我说过的,这种异常只发生在某些运行中,而不是总是发生。这种情况主要发生在我更改detailLevel = 4的格式模式时,但在再次更改它之后,它仍然需要另一次运行。我猜想这实际上可能与Eclipse有关,但我也无法调试代码,因为异常会抛出到stage.show调用中,我完全不明白这一点。造成这种随机异常的原因是什么,我如何解决它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-26 04:27:26

在JavaFX中,和大多数其他GUI工具包一样,有一个特定的线程处理所有与UI相关的操作。应用程序不得在此线程之外更新UI。如果需要从另一个线程更新UI,通常可以使用API来确保代码在UI线程的上下文中执行。如果是JavaFX,有关更多信息,请参见JavaFX教程中的并发性

在您的情况下,最简单的解决方案是确保setText()调用在JavaFX应用程序线程上执行,而不是在与Task关联的线程上执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
Platform.runLater(() -> setText(nowTextual));
...

JavaFX中还有其他API可用于动画,这些API可用于在特定时间间隔调用处理程序方法--这将从循环中删除Thread.sleep()调用。有关详细信息,请参阅时间线

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35650627

复制
相关文章
shell脚本实际运用_shell脚本调用另一个脚本
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168438.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
9980
在 Shell 脚本中调用另一个 Shell 脚本的三种方式
fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用 foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。
用户1558438
2018/08/23
4.4K0
在 Shell 脚本中调用另一个 Shell 脚本的三种方式
fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。
IT运维技术圈
2022/10/24
3.5K0
Shell脚本调用另一个脚本的三种方法
如何在其它Shell脚本中调用first.sh呢?主要有三种方法:source、点号以及sh命令。
恋喵大鲤鱼
2019/03/05
12.2K0
我可以在不source脚本的情况下将变量从Bash脚本导出到环境中吗
有没有一种方法可以通过只执行 export.bash 而不 source 它获取 $VAR?
程序熵
2023/09/25
1800
我可以在不source脚本的情况下将变量从Bash脚本导出到环境中吗
我可以在一个构造函数中调用另一个构造函数么
但在 C++11 版本之前是不可以的,不过你可以通过两种方式来模拟实现(可以参见 the C++ FAQ entry),
ClearSeve
2022/02/10
3K0
Python 制作按键触发Windows通知的脚本
对于键盘没有背光灯的同学而言,切换大小写或控制Num键开关的时候没有提示,经常需要试探性地输入一些字符来判断开关是否打开,体验非常糟糕。
abs_zero
2020/12/15
1.8K0
Python 制作按键触发Windows通知的脚本
Shell脚本——函数
调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:
栗筝i
2022/12/01
4280
shell脚本-函数
https://www.cnblogs.com/shenxm/category/1154724.html shell脚本-函数 函数介绍 函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程。 它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell 程序的一部分。 函数和shell程序比较相似,区别在于: Shell 程序在子Shell中运行 而Shell函数在当前Shell中运行。因
菲宇
2022/12/21
5790
脚本接入钉钉Actions自动触发
最近出来实习一直在忙公司的事情。学校那边说,为了我们的安全让每天签到。那个app叫蘑菇丁。不知道大🔥用过没,貌似很小众。以前的脚本写的惨不忍睹,近期看到国光哥的 Python 实现 T00ls 自动签到脚本(邮件+钉钉通知)发现脚本可以用钉钉通知涨姿势了。还发现Github 自带的 Actions 可以定时执行脚本,正好vps要到期了。。。。所以就改造了下自己的脚本。 接入钉钉 点击头像进入详情,自定义机器人。这时候需要创建一个群组 创建后会得到一个webhook地址 https://oapi.di
用户2700375
2022/06/09
8980
脚本接入钉钉Actions自动触发
复制查到到的文件到另一个目录(shell脚本)
Test:find ../../res.bak/item/ -type f -name "*.jpg" |xargs -n1 -i echo {}."abc"
meteoric
2018/11/16
1.4K0
【shell脚本】$ 在shell脚本中的使用
注释:$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数
码缘
2019/07/01
6.2K0
jenkins自动触发构建_jenkins调用bat脚本
跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。 jenkins的定时任务是用的crontab语法
全栈程序员站长
2022/09/19
1.2K0
jenkins自动触发构建_jenkins调用bat脚本
在ClickHouse中自定义脚本函数
在先前的一篇文章中我曾介绍过,如何在 ClickHouse 中用 SQL 创建 UDF 自定义函数 ,《传送门》在此。
Nauu
2022/03/29
4.3K0
Shell脚本,你会吗?
5)有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程。
kubernetes中文社区
2019/07/23
7540
【Groovy】Groovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )
在 命令行 , Groovy 脚本 , Groovy 类 , Java 类中 , 可以调用 Groovy 脚本 ;
韩曙亮
2023/03/30
2K0
【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )
在 【Groovy】Groovy 脚本调用 ( Groovy 脚本编译 | Groovy 脚本字节码文件分析 ) 博客中 , 已经分析了 Groovy 脚本的本质 , Groovy 脚本继承了 groovy.lang.Script 类 ;
韩曙亮
2023/03/30
1.9K0
【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )
java构造函数调用另一个构造函数_java中的构造函数
* 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
用户7886150
2021/04/29
4.5K0
python挖矿脚本代码_一个挖矿脚本
遇到一台机器偶尔cpu使用率达到80%,触发告警。登录查看后一个sshd2程序导致cpu负载高
全栈程序员站长
2022/09/14
2.3K0
[golang]写了一个可以用 go 来写脚本的工具:gosl
代码和使用说明可以看这里: http://github.com/daviddengcn/gosl
landv
2019/09/30
2K0

相似问题

我可以从另一个shell脚本调用shell脚本的函数吗?

76

可以在页面脚本之前触发扩展脚本吗?

11

可以从另一个脚本调用php脚本吗?

11

Python脚本触发另一个脚本中的方法

31

可以从另一个python脚本中运行python脚本吗?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文