首页 > 解决方案 > 由于线程问题导致的 IllegalStateException

问题描述

我正在尝试为应用程序创建一个窗口。窗口的大小是通过获取主屏幕的边界来确定的。为了做到这一点,我创建了两个类。

RealMain 类是执行所有操作的实际类:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Rectangle2D;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.stage.Screen;
import javafx.stage.Stage;

public class RealMain extends Application {

    public static final double minWindowWidth;
    public static final double minWindowHeight;

    //Get primary screen bounds
    static {
        System.out.println(Thread.currentThread().getName());
        Rectangle2D screenBounds = Screen.getPrimary().getBounds();
        minWindowWidth = screenBounds.getWidth() / 2;
        minWindowHeight = screenBounds.getHeight() / 1.5;
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        Scene scene = new Scene(new HBox(), minWindowWidth, minWindowHeight);
        primaryStage.setScene(scene);
        primaryStage.sizeToScene();
        primaryStage.show();
        primaryStage.setMinWidth(primaryStage.getWidth());
        primaryStage.setMinHeight(primaryStage.getHeight());
    }

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

主类只是程序的入口点。它所做的只是调用 RealMain 的 main 方法。为什么我首先需要使用 Main 类(为什么不直接运行 RealMain 的 main 方法)?这是因为我遇到了一个不同的问题,我会得到“错误:JavaFX 运行时组件丢失,并且需要运行这个应用程序”。在 macOS 上将程序作为 jar 运行时。显然,将常规 java 类设置为入口点将解决此问题(我在这里找到此解决方案的一个地方),因此我需要创建 Main 类。

public class Main {
    public static void main(String[] args) {
        RealMain.main(args);
    }
}

当我运行 RealMain 类的主要方法时,它工作正常。但是,如果我使用 Main 类的 main 方法,则会收到以下错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at RealMain.<clinit>(RealMain.java:19)
    at Main.main(Main.java:4)
Caused by: java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = main
    at com.sun.glass.ui.Application.checkEventThread(Application.java:441)
    at com.sun.glass.ui.Screen.setEventHandler(Screen.java:369)
    at com.sun.javafx.tk.quantum.QuantumToolkit.setScreenConfigurationListener(QuantumToolkit.java:684)
    at javafx.stage.Screen.<clinit>(Screen.java:74)
    ... 2 more

所以似乎从Main类运行程序时,主线程用于执行静态块,这似乎是导致错误的原因(至于为什么,我不知道)。同时,从 RealMain 类运行程序时,JavaFX 应用程序线程用于静态块,工作正常。我想合乎逻辑的解决方案是以某种方式强制程序更改线程并在 JavaFX 应用程序线程上执行静态块,但我不知道该怎么做。

谁能帮我解决这个问题?

标签: javamultithreadingjavafx

解决方案


推荐阅读