当前位置: 首页 > 知识库问答 >
问题:

setFont()方法不能像预期的javafx那样处理label

闻人德庸
2023-03-14

我正在创建一个简短的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个答案

贾烨
2023-03-14

最后,经过几个小时的实验,我发现问题是,每当标签或任何类似控件的字体已经设置为自定义字体时,您不能再次将其设置为另一个自定义字体。我不知道为什么会这样。

您不能这样做:

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
}

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

 类似资料:
  • 我想使用查找从一个集合中获取一些数据并将其放入另一个集合中。 在localfield或foreignfield中写什么都不重要,因为它从player_game_stats中获取所有数据并将其插入player集合中的每个文档中。我想检查localfield和foreignField是否相等,但lookup不检查这一点。我对mongodb使用NoSqlBooster

  • 最后是持久性上下文配置: 我很感谢你的帮助。

  • 但是,使用下面的代码,我只需将列表中第一个项的项号追加到每个项,而不是为每个项添加不同的项号。

  • 我有两个Avro模式V1和V2,在spark中读取如下: V1有两个字段“一”和“二” V2 与新字段:“三” 场景:编写器使用 V1 进行写入,读取器使用 V2 对 avro 记录进行解码。我的期望是看到字段3填充了默认值,即null。但是我在spark工作中遇到了以下异常。 我是不是错过了什么?我的理解是avro支持向后兼容。

  • 我想让某个Kafka主题只保留一天的数据。但如果我们继续向主题(活动)发送数据,它似乎根本没有删除任何数据。我尝试了主题端参数(Retention.ms)和服务器端: 但如果我们继续向它发送数据,它似乎对活的主题不起作用。只有当我们停止向主题发送数据时,它才会遵循保留策略。 那么,一个活动主题的正确配置是什么,只保留数据一段时间?

  • 我正在使用wedriveri o 4.5: 我需要等到某个元素存在,如果它不存在,处理这种情况。 例如: 但如果页面上不存在元素,webdriver会将我的测试标记为失败,并显示消息:“超时10000毫秒。”。尝试减少运行时间或增加测试规格的超时时间(http://webdriver.io/guide/testrunner/timeouts.html); 如果回复promise,确保其得到解决 >