【问题标题】:JavaFX ListView: custom Font not applied properlyJavaFX ListView:自定义字体未正确应用
【发布时间】:2023-03-27 06:32:01
【问题描述】:

我的 JavaFX 应用程序中有一个 ListView,我在其中设置了一个自定义单元格渲染器,如下所示:

    myListView.setCellFactory((params) -> new MyListRenderer());

渲染器类:

class MyListRenderer extends ListCell<MyItemClass> {

    private final Label text;

    MyListRenderer() {
        text = new Label();
        text.setFont(Font.font("Monospaced", 12));
    }

    @Override
    protected void updateItem(MyItemClass item, boolean empty) {
        super.updateItem(item, empty);
        if (item == null || empty) {
            setGraphic(null);
            setText(null);
        } else {
            if(item.isSpecialItem()){
                text.setText("\u25B6 " + item.getString();
                text.setStyle("-fx-font-weight: bold;");
            } else {
                text.setText(item.getString());
                text.setStyle("-fx-font-weight: normal;");
            }
            setGraphic(text);
        }
    }
}

如您所见,我将字体设置为等宽字体,并根据我的项目 ('isSpecialItem') 的标志设置文本和样式

所以,起初它工作正常,当我添加前几个条目时,它们会正确呈现。但是,一旦我选择列表中的任何条目,我的文本标签的字体就会重置为列表单元格的默认字体。有趣的是,似乎只有字体被重置,因为我设置的文本以及样式(粗体或正常)仍然正确应用。

我试着把这行:

text.setFont(Font.font("Monospaced", 12));

updateItem 方法中,以便在每次更新时重新执行它。但是,它仍然不起作用,因为我注意到当我选择项目时甚至没有调用该方法。

所以最后,问题是:在列表视图中选择时,字体由于某种原因被重置,甚至没有再次调用 updateItem 方法,所以我无法将其设置回所需的字体。

任何人都知道这里发生了什么以及我该如何解决它?

谢谢

【问题讨论】:

    标签: listview javafx fonts renderer


    【解决方案1】:

    使用 CSS 文件并将字体系列和字体大小设置为 .list-cell:

    .list-cell {
        -fx-font-family: "Monospaced";
        -fx-font-size: 12px;
    }
    

    编辑

    在评论中回答您的问题:是的,该代码将更改您应用程序中的所有列表单元格。

    您可以为特定的列表单元格或 ID 样式选择器创建自己的样式类选择器。请参阅Skinning JavaFX Applications with CSSJavaFX CSS Reference Guide,有一些简单的示例如何创建它们。

    在您的情况下是 CSS 文件:

    .custom-list-cell {
        -fx-font-family: "Monospaced";
        -fx-font-size: 12px;
    }
    

    MyListRenderer 类:

    MyListRenderer() {
        getStyleClass().add("custom-list-cell");
        text = new Label();
    }
    

    请注意,这将更改自定义 ListCell 中所有 Labeled 组件中的字体。

    【讨论】:

    • 但这不是改变了我的应用程序中的所有列表吗?不幸的是,到目前为止我还没有在 JavaFX 中使用 CSS,你能给我举个例子,说明我如何为这个列表(我在 fxml 文件中定义)进行设置
    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2014-12-02
    • 2012-12-28
    相关资源
    最近更新 更多