在我的应用程序中,我在显示Stage
之前从代码加载其他字体。我遵循this解决方案,我的字体在应用程序jar中,并在任何组件需要之前加载。问题是当我创建分发jar时。无论是从java -jar
开始还是只是双击jar,加载字体大约需要10秒钟,然后显示Stage
。从用户点看,应用程序似乎没有启动。从IDE运行应用程序不会产生延迟,应用程序立即启动。我的代码很简单:
@Override
public void start(Stage primaryStage) throws Exception {
final Font fontRoboto = Font.loadFont(Main.class.getResource("/path/to/font/Roboto-Regular.ttf").toExternalForm(), 12);
final Font fontAwesome = Font.loadFont(Main.class.getResource("/path/to/font/fontawesome-webfont.ttf").toExternalForm(), 12);
FXMLLoader loader = new FXMLLoader(Main.class.getResource("/path/to/my/view/View.fxml"));
final Parent root = loader.load();
Scene scene = new Scene(root, 1200, 800);
primaryStage.setScene(scene);
primaryStage.show();
}
我创建了一个简单的解决方法,它首先显示ProgressIndicator
,在后台加载字体Task
,并在成功替换root
中的Scene
:
ProgressIndicator pi = new ProgressIndicator(-1);
pi.setMaxSize(200, 200);
StackPane sp = new StackPane(pi);
Scene scene = new Scene(sp, 1200, 800);
Task fontTask = new Task<Void>() {
@Override
protected Void call() throws Exception {
final Font fontRoboto = Font.loadFont(Main.class.getResource("/path/to/font/Roboto-Regular.ttf").toExternalForm(), 12);
final Font fontAwesome = Font.loadFont(Main.class.getResource("/path/to/font/fontawesome-webfont.ttf").toExternalForm(), 12);
return null;
}
};
fontTask.setOnSucceeded(e -> {
scene.setRoot(root);
});
new Thread(fontTask, "FONT TASK").start();
primaryStage.setScene(scene);
primaryStage.show();
但这只是一种解决方法,并且始终在应用程序启动时显示ProgressIndicator
,仅用于加载字体是无效的。
为加载字体创建单独的Task
给了我另一个问题。我是否必须在JavaFX应用程序线程中调用Font.loadFont
?从我的代码片段我假设不必在FX线程中加载字体。所有字体都在应用程序中正确显示。
我的操作系统:Windows 7 Home Premium SP1
Java:Java 1.8.0_101-b13
IDE:NetBeans 8.1
有人遇到过这个问题吗?