JavaFX ListView:自定义字体未正确应用

时间:2017-02-08 20:39:26

标签: listview javafx fonts renderer

我的JavaFX App中有一个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);
        }
    }
}

正如您所看到的,我将字体设置为Monospaced,并且还根据项目的标志设置了文本和样式('isSpecialItem')

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

我试着把这一行:

text.setFont(Font.font("Monospaced", 12));
updateItem方法中的

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

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

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

由于

1 个答案:

答案 0 :(得分: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组件中的字体。