Java FX Как стилизовать элемент в 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....
                        }
                    }
                }
});

Есть ли метод, позволяющий вызывать этот метод каждый раз, когда пользователь включается или выключается? Другое, а затем использование потока, потому что я вижу, что он создает новый список каждый раз, когда он вызывается ...

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
232
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте то, что вы можете наблюдать, и наблюдайте за этим ...

Например. если на вашем 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 */
}

Отличное элегантное решение! Спасибо, сэр! Работает как шарм!

Gavriil 15.03.2018 19:09

Другие вопросы по теме