"Нет выбранного элемента" в JavaFX combobox?

Как правильно поместить элемент, значение которого равно null, в поле со списком? Я пробовал использовать myComboBox.getItems().add(null);, и он работает, но когда пользователь выбирает значение в поле со списком, исключение на консоль:

Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException
    at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(ReadOnlyUnbackedObservableList.java:136)

Так что я думаю, это не правильный способ сделать это. Есть зацепки?

2 ответов


по моему опыту, это проблема, представленная в Java 8u20. В Java 8u05 и 8u11, а также JavaFX 2.x, вы можете добавить null к списку элементов, и выбор этого элемента вел себя так, как ожидалось. В Java 8u20 вы получите java.lang.IndexOutOfBoundsException при выборе null значение.

Benjamin Gale: вам нужно будет использовать Java 8u20, выбрать элемент в поле со списком, а затем выбрать null значение, чтобы увидеть эту проблему.

В настоящее время, лучшим вариантом представляется для создания специального null-объект и пометить его соответствующим образом, как уже упоминалось.

альтернативно, если вы можете обойтись с помощью ChoiceBox вместо этого, я думаю, вы обнаружите, что он работает так, как вы хотите.


Я думаю, что это должно быть что-то с вашим кодом, что вы не показываете нам как SSCCE ниже работает нормально и не выдает никаких исключений.

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class NullComboBoxApp extends Application {

    @Override
    public void start(Stage primaryStage) {

        ComboBox<String> cb = new ComboBox<>(FXCollections.observableArrayList(
                "Option 1",
                "Option 2",
                "Option 3"
        ));

        cb.getItems().add(null);

        StackPane root = new StackPane();
        root.getChildren().add(cb);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Null ComboBox Example");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
} 

хотя это действительно работает, почему вы хотите, чтобы ваши пользователи могли выбрать null за пределами меня...это действительно то поведение, которое вы хотите? Я подозреваю, что вы действительно хотите иметь возможность очистить текущий выбор, что-то вроде:

cb.getSelectionModel().clearSelection();