我正在使用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));
}
}
结果如下:
答案 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}}
对于所有这些灵魂,你必须删除代码中的一些行,但这样做非常简单,所以我不会详细介绍这一部分。