在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)
所以我想也许这不是正确的做法。有线索吗?
答案 0 :(得分:8)
根据我的经验,这是Java 8u20中引入的一个问题。在Java 8u05和8u11以及JavaFX 2.x中,您可以将null
添加到项目列表中,并选择此项目的行为符合预期。在Java 8u20中,每当选择java.lang.IndexOutOfBoundsException
值时,您将获得null
。
Benjamin Gale:你必须使用Java 8u20,在ComboBox中选择一个项目,然后选择null
值来查看问题。
目前,最佳选择似乎是创建一个特殊的null
- 对象并对其进行适当标记,如前所述。
或者,如果您可以使用ChoiceBox,我认为您会发现它按照您想要的方式工作。
答案 1 :(得分:0)
我认为您的代码必须是您未向我们展示的内容,因为下面的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();
答案 2 :(得分:0)
它实际上在较新的版本中再次起作用。至于我使用 JavaFX 15.0.1。