我有一个 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....
}
}
}
});
是否有方法可以在每次用户开启或关闭时调用此方法?然后使用一个线程,因为我看到每次调用它时都会创建一个新的List ...
答案 0 :(得分:2)
创建您可以观察的东西,然后观察它......
E.g。如果您的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 */
}