【发布时间】:2021-04-15 05:19:05
【问题描述】:
所以我的自定义单元工厂应该从 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:
我在最后一个 else 的开头添加了setText(null);,它清除了原始对象,事情就像现在应该的那样工作,但我不会将此标记为答案,因为我觉得这是某种黑客而不是适当的解决方案。
EDIT3:
Message 类、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;
}
【问题讨论】:
-
minimal reproducible example .. 请遵守 java 命名约定!
-
.. 并且不要在每次调用 updateItem 时创建新节点
标签: java javafx custom-cell openjfx