У меня есть Посмотреть список пользователей, которые могут быть вкл выкл.
Я нашел способ стилизовать каждую ячейку на основе некоторого условия:
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 */
}
Отличное элегантное решение! Спасибо, сэр! Работает как шарм!