问题描述
所以我的自定义单元工厂应该从 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);
并清除了原始对象,并且事情现在就像他们应该的那样工作,但我不会将此标记为答案,因为我觉得这是某种黑客行为适当的解决方案。
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;
}
解决方法
这是 JFoenix 中的一个错误,似乎 setText(null)
是解决它的唯一方法,直到他们修复它Here is a ticket