Java FX如果更改了ListView中的项目的样式

时间:2018-03-15 17:11:08

标签: java javafx javafx-8 javafx-2

我有一个 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 ...

1 个答案:

答案 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 */
}