私が使用しているJavaFXコンポーネントは、Swingの対応製品とは異なり、一部のシステムフォントを適切にレンダリングしていないことに気付きました。この問題を示す完全な例を次に示します。JavaFXがすべてのシステムフォントを見つけられない
public class JavaFXApplication1 extends Application {
@Override
public void start(Stage primaryStage) {
// Swing button
SwingNode node = new SwingNode();
SwingUtilities.invokeLater(() -> {
JButton swingButton = new JButton("Comic Sans MS");
swingButton.setFont(new java.awt.Font("Comic Sans MS", java.awt.Font.PLAIN, 20));
node.setContent(swingButton);
});
// JavaFX button
Button fxButton = new Button("Comic Sans MS");
fxButton.setFont(Font.font("Comic Sans MS", 20));
HBox hbox = new HBox();
hbox.getChildren().addAll(node, fxButton);
Scene scene = new Scene(hbox, 300, 250);
primaryStage.setTitle("Font test");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
システムにComic Sans MSフォントがある場合は、次の結果が表示されます。唯一のSwingコンポーネントは正常に見える:
どうやらFXグラフィックスシステムが起動時にすべてのシステムフォントをロードしません。最も明白な解決策は、そのように、手動で不足しているものをロードすることです:
Font.loadFont(new FileInputStream(System.getenv("WINDIR")+"\\fonts\\"+"comic.ttf"), 20);
今、すべてが正しくレンダリングが、このソリューションは、クロスプラットフォームではありませんし、私は本当にそれがアウト・オブ・ザ・動作することを期待したいですスイングと同じように何か不足していますか?そうでない場合、システムフォントのサブセットのみがJavaFX環境にロードされるのはなぜですか?
私は、Windows 10上で
Windowsで問題を再現することができなかったため、少し不安でしたが、OSに固有のものかもしれません.Windows 7にはcomic-sxフォントが既に用意されています。 getFontNames()と利用可能なフォントを見て、awtと同様の方法でループ内にロードすることができます。http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/Togetallavailablefontsinyoursystem.htm – D3181
@ Dean219 - 私はWindows 10でそれを実行することに言及することを忘れていた。それはWindows 7で動作する場合、おそらくそれはOS固有のバグです。 – Dth
それは他の人にはうまくいかないかもしれませんが、特定のシステムフォントを読み込むことができるので、問題の可能性があるすべてのフォントではなく、Windows 10に多種多様なフォントそれから、漫画サンは、それがロードするデフォルトフォントではないので、Windows 10で再現可能な問題かもしれませんが、フォントクラスを使用してどのフォントを使用できるかを印刷して、リストにあるかどうかを確認し、特にそれらを呼び出すことなく動作するリスト。 – D3181