带有静态关键字的JavaFX问题;以最少、完整且可验证的示例

带有静态关键字的JavaFX问题;以最少、完整且可验证的示例,java,javafx,static,Java,Javafx,Static,你好 当我运行此代码时: 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 j

你好

当我运行此代码时:

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
线程“main”java.lang.ExceptionInInitializeError中的异常 在mcve。(mcve.java:11) 位于java.lang.Class.forName0(本机方法) 位于java.lang.Class.forName(Class.java:264) 位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:122) 原因:java.lang.IllegalStateException:工具箱未初始化 位于com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:273) 位于com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:268) 位于com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:550) 位于com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:512) 位于javafx.scene.control.control.(control.java:87) ... 4更多 但是,如果在顶部的标签之前删除static关键字,代码就可以正常运行


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

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

为什么在创建
静态标签
而不是
静态矩形
时会发生错误

本质上,这是一个初始化顺序的问题。创建
节点
对象时,需要正确初始化UI平台。它也可能发生在
矩形
上,但最有可能的是
标签
(即
控件
)更依赖于正确初始化的平台。在这种特殊情况下,区别在于
形状
对象不需要
CSS
,而
控制
对象需要。这会导致在工具箱尚未初始化时调用平台方法,如堆栈跟踪中所示

  • 加载
    class mvce
    时,将初始化
    静态
    类成员。这是在调用
    main()
    方法之前完成的,因此是在调用
    launch()
    方法之前完成的。此时平台尚未初始化

  • 另一方面,非静态成员在实例化
    class mvce
    时初始化。
    类mvce
    在工具包正确初始化后,通过
    launch()
    方法在内部实例化


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

请不要仅仅为了添加更多信息而发布与现有问题重复的问题。如果要添加更多详细信息,应编辑您的。您现在已将此讨论分为两个平行线程。“我希望标签是静态的”。为什么?这个imho没有有效的用例。我对这段代码进行了逐字测试,它实际上在我的平台(JDK 8 u71,OSX 10.11.3)上运行得很好。控件需要CSS,因此
Control
有一个静态初始值设定项,可以有效地调用
Application.setUserAgentStylesheet()
,它委托给FX应用程序线程。如果我在一个普通Java类中实例化一个控件(但不是像OP的代码那样在
应用程序
子类中),这会为我生成一个异常<代码>矩形
不需要CSS。谢谢大家的帮助。我的问题得到了回答!