当前位置: 首页 > 面试题库 >

带有静态关键字的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之前删除static关键字,则代码可以正常运行。

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


问题答案:

为什么创建a static Label而不创建a时会发生错误static Rectangle

本质上,这是初始化顺序的问题。创建Node对象时,需要正确初始化UI平台。潜在地,它也可能发生在上Rectangle,但很可能a
Label(是Control)更多地依赖于正确初始化的平台。在此特定情况下,不同之处在于Shape对象不需要CSS,而Control对象则需要。这将导致在工具包尚未初始化时调用平台方法,如堆栈跟踪所示。

  • static当类成员初始化class mvce时加载。这是在main()html" target="_blank">调用方法之前完成的,因此launch()是在调用方法之前完成的。该平台目前尚未初始化。

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

同样,通常没有理由使用静态引用。只需使用一个成员。



 类似资料:
  • 日安, 当我运行此代码时: 它会创建以下异常: 但是,如果我在顶部的Label之前删除了静态关键字,代码运行得很好。 我的问题是:为什么创建静态标签而不是静态矩形时会出现错误?我希望标签是静态的,而不是一个类的对象。

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

  • 使(或其他集合)成为final的优点/缺点是什么?如果我们尝试这样做呢: 这是有效的吗?现在引用A将指向L所指向的这个数组列表?请帮帮忙。

  • 我有个问题。 我在推送通知中有一个深度链接的逻辑。 这是FCM现在的json: 是否有一种方法可以继续使用这个json模型并在后台接收调用?

  • 问题内容: 这三种方法(都用于将一个数组转换为另一个数组)之间的性能差异(如果有)是什么? 使用 使用和λ/关闭功能 使用带有“静态”函数/方法 还有其他方法吗? 为了使自己清楚,让我们看一下这些示例,它们都做同样的事情-将数字数组乘以10: 佛瑞奇 带有lambda的地图 具有“静态”功能的地图,作为字符串引用传递 还有其他方法吗?我将很高兴听到上面案例之间的 所有 实际差异,以及为什么要使用一

  • null 还有其他办法吗?我将很高兴听到实际所有的差异之间的情况从上面,以及任何输入为什么应该使用一个而不是其他。