我的 JfxListView 的自定义单元工厂返回原始对象

问题描述

所以我的自定义单元工厂应该从 Message 对象返回两个字段,而不是我在 ListView Output from ListView 中获取原始对象。

有一段代码负责格式化两个 Text 对象,这些对象从 Message 对象的字段中获取值。

   messageJFXListView.setCellFactory(new Callback<ListView<Message>,ListCell<Message>>() {
            @Override
            public ListCell<Message> call(ListView<Message> param) {
                return new JFXListCell<Message>(){
                    @Override
                    public void updateItem(Message item,boolean empty) {
                        super.updateItem(item,empty);
                        if (empty || item == null || item.getMessage() == null) {
                            setText(null);
                        } else if(item.getNickname() == null) {
                            setText(item.getMessage()); // no formatting here yet
                        }
                        else{
                            Text nickname = new Text();
                            nickname.setStyle("-fx-fill: #424242;-fx-font-weight:bold;");
                            nickname.setText("<" + item.getNickname() + "> ");
                            Text message = new Text();
                            message.setText(item.getMessage());
                            getChildren().addAll(nickname,message);
                        }
                    }
                };
            }
        });
    }

getChildren().addAll(nickname,message); 更改为 getChildren().addAll(new TextFlow(nickname,message)); 后,它几乎可以工作,但是昵称部分没有设置样式,是的,原始对象仍然打印 The output from TextFlow change

编辑: 相反 getChildren().addAll() 我使用了 setGraphic(new TextFlow(nickname,message)); 并且现在格式化有效。 It really almost works like it should but raw object is still present

EDIT2: 我在 last else 的开头添加了 setText(null); 并清除了原始对象,并且事情现在就像他们应该的那样工作,但我不会将此标记为答案,因为我觉得这是某种黑客行为适当的解决方案。

EDIT3Message 类、Observable 列表和 JFXListView 使这种情况可重现。

public class Message {
    private String nickname;
    private String message;

    public String getNickname() {
        return nickname;
    }

    public Message(String nickname,String message) {
        this.nickname = nickname;
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
    public Message() {
    }
    public Message(String message) {
        this.message = message;
    }
    
}

public class MainWindowController   {
    @FXML
    public ObservableList<Message> messageObservableList = FXCollections.observableArrayList();
    @FXML
    public JFXListView<Message> messageJFXListView;
}

解决方法

这是 JFoenix 中的一个错误,似乎 setText(null) 是解决它的唯一方法,直到他们修复它Here is a ticket

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...