JavaFX 8:ComboBox按钮单元格更新行为

时间:2015-08-18 07:24:35

标签: combobox javafx-8

我有一个组合框,其中包含Dog类型的项目。如果所有项目都替换为新项目(通过setAll模型上的ObservableList),则项目渲染器可以应对此更新,而按钮单元格渲染器则无法:

Button cell renderer does not update correctly

这是重现问题的最小示例(full source incl. imports on GitHub):

public class ComboBoxRefresh extends Application {

    private static final class Dog {

        private final String name;

        public Dog(String name) {
            this.name = name;
        }
    }

    private static final class DogListCell extends ListCell<Dog> {
        @Override
        public void updateItem(Dog item, boolean empty) {
            super.updateItem(item, empty);
            if (item == null || empty) {
                setText("");
            } else {
                setText(item.name);
            }
        }
    }

    private static List<Dog> createThreeDogs() {
        return range(0, 3).mapToObj(i -> new Dog("Buddy " + i)).collect(toList());
    }

    @Override
    public void start(Stage stage) throws Exception {
        ObservableList<Dog> items = observableArrayList(createThreeDogs());
        ComboBox<Dog> comboBox = new ComboBox<>(items);
        comboBox.setPrefWidth(400);
        comboBox.setCellFactory(listView -> new DogListCell());
        comboBox.setButtonCell(new DogListCell());

        Button button = new Button("Refresh");
        button.setOnAction(event -> {
            List<Dog> newItems = createThreeDogs();
            items.setAll(newItems);
        });

        VBox box = new VBox(10, comboBox, button);
        box.setPadding(new Insets(10));

        Scene scene = new Scene(box);
        stage.setScene(scene);
        stage.show();
    }

}

如果我向equals类添加Dog实现,一切正常,但这不是我实际应用程序中的一个选项。

是否有任何解决办法来强制正确刷新按钮单元?

1 个答案:

答案 0 :(得分:0)

这似乎是一个错误。解决方法可能是

button.setOnAction( event -> {
    List<Dog> newItems = createThreeDogs();
    items.clear();
    items.addAll(newItems);
} );