我正在尝试为应用程序创建一个窗口。窗口的大小是通过获取主屏幕的边界来确定的。为此,我创建了两个类。
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上执行静态块,但是我不知道该怎么做。
有人可以帮我解决这个问题吗?