我的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
方法,所以我无法将其设置回所需的字体。
任何人都知道这里发生了什么以及如何解决它?
由于
答案 0 :(得分:1)
使用CSS文件并将字体系列和字体大小设置为.list-cell
:
.list-cell {
-fx-font-family: "Monospaced";
-fx-font-size: 12px;
}
修改强>
在评论中回答您的问题:是的,该代码将更改您的应用程序中的所有列表单元格。
您可以为特定的列表单元格或ID样式选择器创建自己的样式类选择器。请参阅Skinning JavaFX Applications with CSS和JavaFX 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组件中的字体。