JavaFX ListView:无法向ListCell添加标签

时间:2017-12-14 23:32:18

标签: java javafx

我正在使用JavaFX开发聊天应用。我有一个包含已连接用户的ListView。每个单元格由UserView object:

表示
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; 
    }


}

我想添加一个Label,其中包含收到的邮件数。 这就是我所做的:

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;
            }
        });

为了测试目的,我将每个用户的消息数设置为10:

for (Utilisateur user : users) {
    if(!Helper.getInstance().getCurrentUser().equals(user)){
       UserView uv = new UserView(user, "man.png");
       uv.setNumberofmessage(10);
       connectedUser.add(uv);
       listConv.add(new UserConversation(uv));
    }    
}

结果如下:

enter image description here

1 个答案:

答案 0 :(得分:1)

您尝试使用Label添加getChildren().add(lblMsg);ListCell不是Labeled(或其父Node)的有效用法。您要显示的任何Parent都应设置为单元格的graphicProperty,如果要显示多个节点,可以将容器节点(HBox root = new HBox(5); root.getChildren().addAll(imageView, lblMsg); setGraphic(root); )设置为图形并将节点添加到此父节点。

虽然知道这一点,但仍有几种可能的解决办法:

setText(item.getUser().getNom()+" "+item.getUser().getPrenom() + " " + item.getNumberofmessage());

或者您可以在文本中添加用户数:

lblMsg

这样CSS就会丢失(Label),所以根据你的需要,最好使用两个HBox root = new HBox(5); Label lblUserName = new Label(item.getUser().getNom()+" "+item.getUser().getPrenom()); root.getChildren().addAll(imageView, lblUserName, lblMsg); setGraphic(root);

{{1}}

对于所有这些灵魂,你必须删除代码中的一些行,但这样做非常简单,所以我不会详细介绍这一部分。