"没有选择项目"在JavaFX组合框?

时间:2014-09-16 19:53:47

标签: java javafx javafx-2 javafx-8

在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)

所以我想也许这不是正确的做法。有线索吗?

3 个答案:

答案 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。

相关问题