当前位置: 首页 > 知识库问答 >
问题:

静态关键字存在JavaFX问题;用最少的、完整的、可证实的例子

曹建明
2023-03-14

日安,

当我运行此代码时:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class mcve extends Application {

    static Label myScore = new Label("Test");
    static Rectangle rect = new Rectangle(0,0,10,10);

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

    @Override
    public void start(Stage stage) {
        myScore.setTextFill(Color.WHITE);
        myScore.setLayoutY(20);
        myScore.setLayoutX(200);
        myScore.setFont(new Font("Arial", 30));
        myScore.setText("0");
        rect.setFill(Color.WHITE);

        final Group group = new Group(myScore,rect);
        Scene scene = new Scene(group, 500, 500, Color.BLACK);

        stage.setScene(scene);
        stage.show();
    }
}

它会创建以下异常:

Exception in thread "main" java.lang.ExceptionInInitializerError
at mcve.<clinit>(mcve.java:11)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:122)
Caused by: java.lang.IllegalStateException: Toolkit not initialized
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:273)
at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:268)
at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:550)
at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:512)
at javafx.scene.control.Control.<clinit>(Control.java:87)
... 4 more

但是,如果我在顶部的Label之前删除了静态关键字,代码运行得很好。

我的问题是:为什么创建静态标签而不是静态矩形时会出现错误?我希望标签是静态的,而不是一个类的对象。

共有2个答案

易炳
2023-03-14

您是否尝试过只声明静态标签,但稍后在start()方法中实例化并设置它?这也应该有效。

缪兴腾
2023-03-14

为什么在创建静态标签而不是static矩形时会出现错误?

本质上,这是一个初始化顺序的问题。创建< code>Node对象时,需要正确初始化UI平台。潜在地,这也可能发生在< code>Rectangle上,但是最有可能的是< code>Label(它是一个< code >控件)更加依赖于正确初始化的平台。在这种特殊情况下,区别在于< code>Shape对象不需要< code>CSS,而< code>Control对象需要。这导致平台方法被调用,如堆栈跟踪所示,此时工具箱尚未初始化。

> < li>

加载< code >类mvce时,初始化< code>static类成员。这是在调用< code>main()方法之前完成的,因此是在调用< code>launch()方法之前完成的。此时平台尚未初始化。

另一方面,非静态成员在实例化< code>class mvce时被初始化。工具箱正确初始化后,< code >类mvce由< code>launch()方法在内部实例化。

此外,通常没有理由使用静态引用。用会员就行了。

 类似资料:
  • 问题内容: 美好的一天, 当我运行此代码时: 它创建以下异常: 但是,如果我在顶部的Label之前删除static关键字,则代码可以正常运行。 我的问题是:为什么在创建静态标签而不是静态矩形时会发生错误?我希望Label是静态的,而不是类的对象。 问题答案: 为什么创建a 而不创建a时会发生错误? 本质上,这是初始化顺序的问题。创建对象时,需要正确初始化UI平台。潜在地,它也可能发生在上,但很可能

  • 问题内容: 我要声明一个字段: 首先,问题的顺序吗?如果没有,是否存在标准的可接受序列或约定? 其次,我的应用程序中的是固定的。这是最好的方式来存储其价值吗? 问题答案: 我将Checkstyle与Eclipse结合使用,如果声明的顺序与您指定的顺序不同,则会导致警告,引用Java语言规范(JLS)。例如, 结果是 他们的页面列出了他们期望的顺序,尽管通过该页面上的链接到JLS,我看不到任何东西可

  • 本文向大家介绍Java中的静态关键字,包括了Java中的静态关键字的使用技巧和注意事项,需要的朋友参考一下 静态修饰符 静态变量 在静态关键字用于创建将独立存在的类创建的所有实例变量。无论类的实例数量如何,静态变量只有一个副本存在。 静态变量也称为类变量。局部变量不能声明为静态。 静态方法 static关键字用于创建将独立于为该类创建的任何实例存在的方法。 静态方法不使用定义它们的类的任何对象的任

  • 本文向大家介绍java使用静态关键字实现单例模式,包括了java使用静态关键字实现单例模式的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了使用静态关键字实现单例模式的具体代码,供大家参考,具体内容如下 单例模式:只能获得某个类的唯一一个实例 单例模式,不管什么时间点得到的对象都是同一个对象 看下面代码: 将构造方法私有,以便实现外部无法使用new进行实例化的效果,达到任何时候其实都是同一

  • 我有一个问题已经部分解决了,但我很好奇另一个(更好的)解决方法…我想要一个画布,什么填充整个窗口,并调整自己的大小,如果窗口的大小。 根据这个:https://dlemmermann.wordpress.com/2014/04/10/javafx-tip-1-resizable-canvas/和这个:如何在JavaFX中使canvas可调整大小?我已创建(复制)类: 并将以下内容放入viewfie

  • 本文向大家介绍JS弹出可拖拽可关闭的div层完整实例,包括了JS弹出可拖拽可关闭的div层完整实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS弹出可拖拽可关闭的div层完整实现方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。