由于线程问题导致IllegalStateException

时间:2020-09-13 20:26:45

标签: java multithreading javafx

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

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类设置为入口点可以解决此问题(在我发现此解决方案的地方是here),因此我需要创建Main类。

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

当我运行RealMain类的main方法时,它工作正常。但是,如果我使用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 Application Thread用于静态块,效果很好。我想逻辑上的解决方案是以某种方式强制程序更改线程并在JavaFX Application Thread上执行静态块,但是我不知道该怎么做。

有人可以帮我解决这个问题吗?

0 个答案:

没有答案
相关问题