2016-08-10 3 views
2

Я заметил, что компоненты 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 в вашей системе, вы должны увидеть следующий результат. Только компонент Свинг выглядит отлично:

Broken fonts

Видимо система FX графика не загружает все системные шрифты при запуске. Наиболее очевидным решением является загрузка недостающие вручную, как это:

Font.loadFont(new FileInputStream(System.getenv("WINDIR")+"\\fonts\\"+"comic.ttf"), 20); 

Теперь все делает правильно, но это решение не является кросс-платформенный и я действительно ожидаю, что это работать вне в- как и в Swing. Я что-то упускаю? Если нет, то почему в среду JavaFX загружается только подмножество системных шрифтов?

Я бегу это на Windows, 10.

+1

Я немного не уверен в этом, так как мне не удалось реплицировать вашу проблему на окнах, однако это может быть специфично для ОС, поскольку Windows 7 может уже иметь шрифт Comic-sans, доступный для java-fx при загрузке, однако вы можете попробовать Font. getFontNames() и посмотреть, какие шрифты доступны и, возможно, загрузить их в цикле аналогично этому для awt http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/Togetallavailablefontsinyoursystem.htm – D3181

+0

@ Dean219 - спасибо, Я забыл упомянуть, что я запускаю его в Windows 10. Если он работает в Windows 7, возможно, это ошибка конкретной ОС. – Dth

+0

Ну, это сработало для меня, это может быть не для других, но я бы предположил, что, поскольку вы можете загружать определенные системные шрифты, он может загружать только некоторые из доступных, а не каждый шрифт, который может быть проблемой, может быть, если в Windows 10 будут более разнообразные шрифты то комикс sans не является шрифтом по умолчанию, который он загружает, поэтому он может быть воссоздаваемой проблемой в Windows 10, но вы должны попробовать распечатать, какие шрифты доступны с помощью класса Font и посмотреть, есть ли в списке, и посмотреть, есть ли другие, которые находятся на список, который работает без специального вызова. – D3181

ответ

0

я понял еще одну вещь: я создал следующий код

String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailab‌​leFontFamilyNames(); for(String font: fonts) { System.out.printf("This is font %s %n", font); 

Это возвращает, например: Это шрифт что-то странное (его шрифт, который я загружен и установлен), поэтому он доступен. Но когда я помещу его в этот код:

<GridPane fx:controller="sample.Controller" 
     xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10" 
     style="-fx-font-family: Something Strange"> 

Текст не изменяется вообще. Возможно, это способствует вашей/нашей проблеме.

+0

Ymm, так как это не ответ на мой вопрос, я думаю, вы должны опубликовать его как комментарий или оставить его как есть, так как наши вопросы уже связаны. – Dth

+0

О, хорошо, что вы можете связать его, не знал этого. Извините, что я разместил его как ответ. Все еще привык к stackoverflow. –

Смежные вопросы