"Нет выбранного элемента" в 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();
