java - 由于线程问题导致的 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 应用程序线程上执行静态块,但我不知道该怎么做。
谁能帮我解决这个问题?
解决方案
推荐阅读
- ios - AppCenter 找不到 Swift 项目
- java - gradle 同步问题:CreateProcess 错误=2
- c# - 未定义或导入预定义类型“System.Object”
- java - 如何在 KafkaBootstrapConfiguration 中覆盖 KafkaListenerEndpointRegistry
- mongodb - 如何在 MongoDB 中链接左连接?
- jquery - 如何在 JQuery lightSlider 中延迟加载图像?
- java - Kafka + 使用 prometheus 与 kafka cli 命令有冲突
- php - 如何为空值显示空白?
- php - 请求触发时,在 PHP 中向 Amazon SES 发送电子邮件会冻结
- c++ - OpenCV逐帧视频拼接