【问题标题】:Custom cell factory for my JfxListView returns raw objects我的 JfxListView 的自定义单元工厂返回原始对象
【发布时间】: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);,它清除了原始对象,事情就像现在应该的那样工作,但我不会将此标记为答案,因为我觉得这是某种黑客而不是适当的解决方案。

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;
}

【问题讨论】:

标签: java javafx custom-cell openjfx


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多