setFont()方法不能像预期的那样在标签上使用javafx

时间:2016-11-02 19:46:06

标签: java javafx-8

我正在创建一个简短的javafx程序,其中包含带有一些文本和按钮的标签,该按钮应该将标签的字体更改为斜体。由于我使用的字体是自定义字体,因此我无法直接调用new Font("human.ttf", FontPosture.ITALIC, 20),因为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);
    }
}

请告诉我是否需要进行任何澄清。提前谢谢。

1 个答案:

答案 0 :(得分: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
}

编辑:发生此问题是因为我使用的字体文件是同一字体系列的编辑版本。因此,如果您有一个常规和样式版本的字体文件,然后您想将样式版本应用于已设置为常规版本的文本,则此方法可以很好地工作。