gpt4 book ai didi

Java FX 如何在 ListView 中更改项目的样式

转载 作者:行者123 更新时间:2023-12-02 02:15:52 25 4
gpt4 key购买 nike

我有一个ListView个可以打开/关闭的用户。

我找到了一种根据某些条件设置每个单元格样式的方法:

friends.setCellFactory(lv -> new ListCell<String>() {
@Override
protected void updateItem(String friendname, boolean empty) {
super.updateItem(friendname, empty);
if (empty) {
setText(null);
setStyle("");
} else {
setText(friendname);
if (usersService.isOnline(friendname)) {
do stuf....
}
}
}
});

是否有一种方法可以让我在每次用户打开或关闭时调用此方法?其他则使用线程,因为我看到它每次调用时都会创建一个新列表...

最佳答案

创造一些你可以观察的东西,然后观察它......

例如如果您usersService有一个 ObservableList<String> onlineUsers ,包含每个在线用户的用户名列表,您可以执行以下操作:

friends.setCellFactory(lv -> {

ListCell<String> cell = new ListCell<String>() {

@Override
protected void updateItem(String friendname, boolean empty) {
super.updateItem(friendname, empty);
if (empty) {
setText(null);
setStyle("");
} else {
setText(friendname);
}
}

};

cell.styleProperty().bind(new StringBinding() {
{ bind(cell.itemProperty(), usersService.getOnlineUsers()); }
@Override
protected String computeValue() {
if (cell.getItem() == null) {
return "" ;
}
if (usersService.getOnlineUsers().contains(cell.getItem())) {
return "/* online style here */";
}
return "/* offline style here*/" ;
}
});

return cell ;

});

然后,每当在线用户列表发生变化时,单元格就会相应更新。

您可以通过使用外部 CSS 文件和自定义 PseudoClass 来简化此操作:

PseudoClass online = PseudoClass.getPseudoClass("online");

friends.setCellFactory(lv -> {

ListCell<String> cell = new ListCell<String>() {

@Override
protected void updateItem(String friendname, boolean empty) {
super.updateItem(friendname, empty);
setText(friendname);
}

};

InvalidationListener listener = obs ->
cell.pseudoClassStateChanged(online,
cell.getItem() != null
&& usersService.getOnlineUsers().contains(cell.getItem()));
cell.itemProperty().addListener(listener);
usersService.getOnlineUsers().addListener(listener);

return cell ;

});

然后在你的 CSS 文件中执行

.list-cell {
/* offline style rules here */
}
.list-cell:online {
/* online style rules here */
}

关于Java FX 如何在 ListView 中更改项目的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49305398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com