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

js81xvg6  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(167)

所以我的自定义单元格工厂应该从 Message 对象,而是我得到原始对象 ListView 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)); 它几乎可以工作,但样式并没有设置在昵称部分,而且原始对象仍然打印在textflow change的输出中。
编辑:改为 getChildren().addAll() 我用过 setGraphic(new TextFlow(nickname,message)); 现在格式化就行了。它几乎可以正常工作,但原始对象仍然存在
edit2:我加了一句 setText(null); 在上一个else的开始,它清除了原始对象,事情现在正常工作,但我不会把这个标记为答案,因为我觉得这是某种黑客而不是正确的解决方案。
编辑3: Message 类、observable list和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;
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题