自定义字体加载时间

时间:2017-04-04 13:43:54

标签: java javafx

在我的应用程序中,我在显示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

有人遇到过这个问题吗?

0 个答案:

没有答案