JavaFX列表视图:无法';t向ListCell添加标签

JavaFX列表视图:无法';t向ListCell添加标签,java,javafx,Java,Javafx,我正在使用JavaFX开发聊天应用程序。我有一个包含已连接用户的列表视图。每个单元格由UserView对象表示: public class UserView { private Utilisateur user; //user private String avatar;// user's avatar private int numberofmessage = 0; //number of received messages. public UserView

我正在使用JavaFX开发聊天应用程序。我有一个包含已连接用户的
列表视图
。每个单元格由
UserView
对象表示:

public class UserView {

    private Utilisateur user; //user
    private String avatar;// user's avatar
    private int numberofmessage = 0; //number of received messages.

    public UserView(Utilisateur user, String avatar) {
        this.user = user;
        this.avatar = avatar;
    }

    public Utilisateur getUser() {
        return user;
    }

    public void setUser(Utilisateur user) {
        this.user = user;
    }


    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }

    public int getNumberofmessage() {
        return numberofmessage;
    }

    public void setNumberofmessage(int numberofmessage) {
        this.numberofmessage = numberofmessage;
    }

    public void InscrementMessages(int nbr){
        this.numberofmessage +=nbr; 
    }


}
我想添加一个
标签
,其中包含收到的邮件数。 我就是这么做的:

usersList.setCellFactory(new Callback<ListView<UserView>, ListCell<UserView>>() {
            @Override
            public ListCell<UserView> call(ListView<UserView> param) {
               ListCell<UserView> cell = new ListCell<UserView>(){
                   @Override
                   protected void updateItem(UserView item, boolean empty) {
                       super.updateItem(item, empty);

                       if(!empty){

                           Image img = new Image("/images/"+item.getAvatar());
                           ImageView imageView = new ImageView(img);
                           imageView.setFitHeight(65);
                           imageView.setFitWidth(65);
                           setGraphic(imageView);
                           setText(item.getUser().getNom()+" "+item.getUser().getPrenom());

                           lblMsg = new Label();
                           if(item.getNumberofmessage() == 0){
                               lblMsg.setText("");
                           }
                           else{
                               lblMsg.setText(String.valueOf(item.getNumberofmessage()));
                               lblMsg.getStyleClass().clear();
                               lblMsg.getStyleClass().add("newMsg");
                           }

                           getChildren().add(lblMsg);
                       }
                   }

               };
               return cell;
            }
        });
结果是:


您尝试使用
getChildren().add(lblMsg)添加
标签
不是
列表单元格
(或其标记为)的父项的有效用法。要显示的任何
节点
都应设置为单元格的,如果要显示多个节点,可以将容器节点(父节点)设置为图形,并将节点添加到此父节点

虽然知道这一点,但有几种可能的修复方法:

HBox root = new HBox(5);
root.getChildren().addAll(imageView, lblMsg);
setGraphic(root);
或者,您可以将用户数添加到文本中:

setText(item.getUser().getNom()+" "+item.getUser().getPrenom() + " " + item.getNumberofmessage());
这样,CSS将丢失(
lblMsg
),因此根据您的需要,最好使用两个
标签:

HBox root = new HBox(5);
Label lblUserName = new Label(item.getUser().getNom()+" "+item.getUser().getPrenom());
root.getChildren().addAll(imageView, lblUserName, lblMsg);
setGraphic(root);

对于所有这些解决方案,您必须删除代码中的一些行,但这样做非常简单,因此我将不详细介绍这一部分。

List cell不是真正的父元素,也没有确定的方式来布局其子元素。您可以直接在单元格文本上设置数量,或者为堆栈窗格设置图形并在那里执行所有逻辑操作(在那里添加图像视图和标签)。谢谢,我使用了您提到的第三种解决方案,效果很好。还有一个问题:您能告诉我如何将标签与单元格左侧对齐吗?
root.setAlignment(Pos.CENTER_left)将使整个
HBox
垂直居中,水平向左对齐。
HBox root = new HBox(5);
Label lblUserName = new Label(item.getUser().getNom()+" "+item.getUser().getPrenom());
root.getChildren().addAll(imageView, lblUserName, lblMsg);
setGraphic(root);