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