JavaFX列表视图:无法';t向ListCell添加标签
我正在使用JavaFX开发聊天应用程序。我有一个包含已连接用户的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
列表视图
。每个单元格由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);