2016-11-02 31 views
0

我創建包含與一些文本,這是爲了改變標籤的字體爲斜體的按鈕標籤的短JavaFX的程序。由於我使用的字體是自定義字體,我不能直接調用new Font("human.ttf", FontPosture.ITALIC, 20)作爲JavaFX的不能轉換自定義字體爲斜體或加粗。setfont程序()方法標籤上工作不正常的JavaFX

所以我決定與同一字體家族兩個不同的字體文件與一個有規則的風格和其他有斜體樣式。因此,當單擊斜體按鈕時,程序將載入斜體字體文件並將標籤的字體設置爲斜體字體。

但是,當我試圖程序,標籤的字體仍然單擊傾斜按鈕後不受影響。我努力尋找問題的根源,並添加了幾個打印語句。在這個過程中,我發現問題是按鈕的eventHandler中的setFont方法無法正常工作。由於打印聲明我還發現字體文件路徑是正確的。因此,我無法弄清楚我的代碼中的錯誤。

這是FontChanger類:

public class FontChanger extends Application{ 

    private Label label; 

    private Font font; 

    public void start(Stage primaryStage){ 
     AnchorPane root = new AnchorPane(); 
     root.setPrefHeight(30); 
     root.setPrefWidth(30); 
     addLabel(root); 
     addItalicButton(root); 

     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.sizeToScene(); 
     primaryStage.show(); 
    } 

    public void addLabel(AnchorPane root){ 
     label = new Label("Sample text"); 
     font = Font.loadFont(FontChanger.this.getClass().getResource("human.ttf").toExternalForm (), 20); 
     label.setFont(font); 
     label.setLayoutX(10); 
     label.setLayoutY(10); 
     root.getChildren().add(label); 
    } 


    public void addItalicButton(AnchorPane root){ 
     Button italicButton = new Button("italic"); 
     italicButton.setLayoutX(10); 
     italicButton.setLayoutY(35); 
     italicButton.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       font = Font.loadFont(FontChanger.this.getClass().getResource("human_italic.ttf").toExternalForm(), 20); 
       System.out.println(FontChanger.this.getClass().getResource("human_italic.ttf").to ExternalForm()); 
       label.setFont(font); 
      } 
     }); 
     root.getChildren().add(italicButton); 
    } 

    public static void main(String[] args){ 
     launch(args); 
    } 
} 

請告訴我,如果需要任何澄清。提前致謝。

回答

0

最後實驗了幾個小時之後,我發現,問題是,每當一個標籤或任何類似的控件的字體已被設置爲自定義字體,則無法再次將其設置爲其他自定義字體。我不知道爲什麼會發生這種情況。

你不能做到這一點:

public void setFont(){ 
    Font firstCustomFont = Font.loadFont(FontChanger.this.getClass().getResource("firstCustomFont.ttf").toExternalForm(), 20); 
    label.setFont(firstCustomFont); 
    Font secondCustomFont = Font.loadFont(FontChanger.this.getClass().getResource("secondCustomFont.ttf").toExternalForm(), 20); 
    label.setFont(secondCustomFont);// this will not work 
} 

我也發現了,你可以設置標籤的字體是正常字體將其設置爲自定義字體後。如果已將字體設置爲本地字體,則還可以將字體設置爲自定義字體。

這兩個例子將工作:

public void setFont(){ 
    Font customFont = Font.loadFont(FontChanger.this.getClass().getResource("customFont.ttf").toExternalForm(), 20); 
    label.setFont(customFont); 
    Font normalFont = Font.font(20); 
    label.setFont(normalFont);// this will work 
} 

和:

public void setFont(){ 
    Font normalFont = Font.font(20); 
    label.setFont(normalFont); 
    Font customFont = Font.loadFont(FontChanger.this.getClass().getResource("customFont.ttf").toExternalForm(), 20); 
    label.setFont(customFont);// this will work 
} 

所以我申請的訣竅是,我首先設置標籤的字體到本地字體,然後設置字體再一次到你想要設置的自定義字體。

事情是這樣的:

public void setFont(){ 
    Font firstCustomFont = Font.loadFont(FontChanger.this.getClass().getResource("firstCustomFont.ttf").toExternalForm(), 20); 
    label.setFont(font); 
    Font normalFont = Font.font(20); 
    label.setFont(normalFont); 
    Font secondCustomFont = Font.loadFont(FontChanger.this.getClass().getResource("secondCustomFont.ttf").toExternalForm(), 20); 
    label.setFont(secondFont);// this will work 
} 

編輯:發生這個問題,因爲我使用的字體文件是相同的字體系列的編輯版本。所以如果你有一個字體文件的常規和風格版本,然後你想將風格版本應用到已經設置爲常規版本的文本,這種方法可以工作得很好。

+0

有趣:看起來像一個bug。 'Label.setFont'將委託給'fontProperty()。set(...)'方法。如果提供的字體與當前字體相同(在'.equals(...)')的意義上,則該方法變爲空操作。 'Font'定義'.equals(...)'來比較字體的名稱和大小;所以如果分配給自定義字體的名稱是相同的,那麼我認爲這就是失敗的原因。 'firstCustomFont.getName()'和'secondCustomFont.getName()'返回什麼? –

+0

是的,你說得對。他們返回相同的價值。這是因爲我使用的字體文件是相同字體文件的編輯版本。所以這是我認爲我沒有考慮的領域。謝謝您的意見。 –

+0

所以如果你可以通過某種方式在文件名上添加某種版本控制.... –