2016-11-02 6 views
0

私は、テキストのラベルを含む短いjavafxプログラムと、ラベルのフォントをイタリックに変更するボタンを作成しています。私が使用するフォントはカスタムフォントであるため、javafxはカスタムフォントをイタリックまたは太字に変換できないため、new Font("human.ttf", FontPosture.ITALIC, 20)を直接呼び出すことはできません。setFont()メソッドが期待どおりのラベルで動作していないjavafx

私は同じフォントファミリの2つの異なるフォントファイルを持っていて、普通のスタイルのフォントファイルと斜体スタイルのフォントファイルを持つことにしました。したがって、イタリックボタンがクリックされると、プログラムはイタリックフォントファイルをロードし、ラベルのフォントをイタリックフォントに設定する。

しかし、私がプログラムを試したときに、イタリック体のボタンをクリックしても、ラベルのフォントは影響を受けません。私は問題の原因を見つけようと努力し、いくつかの印刷ステートメントを追加しました。私が問題を発見したプロセスの中で、ボタンのeventHandlerのsetFontメソッドが正しく動作していないことがわかりました。 printステートメントのせいで、フォントファイルのパスが正しいこともわかりました。したがって、私はコード内の私の間違いを把握することができません。

これは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 
} 

。また、すでにローカルフォントに設定されている場合は、フォントをカスタムフォントに設定することもできます。

これらの2つの例では、動作します:

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

興味深い:それはバグのようです。 'Label.setFont'は' fontProperty()。set(...) 'メソッドに委譲します。与えられたフォントが( '.equals(...)'の意味で)現在のフォントと等しい場合、このメソッドはノーオペレーションになります。 'Font'は、フォントの名前とサイズを比較するために' .equals(...) 'を定義します。したがって、カスタムフォントに割り当てられた名前が同じであれば、これが失敗する理由だと思います。 'firstCustomFont.getName()'と 'secondCustomFont.getName()'は何を返しますか? –

+0

そうです、あなたは正しいです。彼らは同じ値を返します。これは私が使用するフォントファイルが同じフォントファイルの編集版であるためです。これは私が考慮しなかったと思う領域です。ご意見ありがとうございます。 –

+0

ファイル名に何らかのバージョン管理を追加することができれば.... –

関連する問題