所以我的自定义单元格工厂应该从 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;
}
暂无答案!
目前还没有任何答案,快来回答吧!