Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“无选择项”;在JavaFXComboBox上?_Java_Javafx_Javafx 2_Javafx 8 - Fatal编程技术网

&引用;“无选择项”;在JavaFXComboBox上?

&引用;“无选择项”;在JavaFXComboBox上?,java,javafx,javafx-2,javafx-8,Java,Javafx,Javafx 2,Javafx 8,将值为null的项放入组合框中的正确方法是什么? 我尝试使用myComboBox.getItems().add(null),它可以工作,但每当用户在组合框上选择此值时,控制台上就会抛出一个异常: Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.s

将值为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)

所以我认为这可能不是正确的方法。有什么线索吗?

我认为您的代码中一定有什么东西没有显示给我们,因为下面的代码工作正常,不会引发任何异常

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);
    }
} 

根据我的经验,这是Java8U20中引入的一个问题。在Java8U05和8u11以及JavaFX2.x中,您可以将
null
添加到项目列表中,并按预期选择此项目。在Java8U20中,每当选择
null
值时,您将获得
Java.lang.IndexOutOfBoundsException

Benjamin Gale:您必须使用Java 8u20,在组合框中选择一项,然后选择
null
值来查看问题

目前,最好的选择似乎是创建一个特殊的
null
-对象,并对其进行适当的标记,如前所述


或者,如果您可以改用ChoiceBox,我想您会发现它的工作方式符合您的要求。

我认为,SO希望使用户能够在combobox中选择空值。如果是这种情况,那么我建议创建特殊的NULL对象(表示组合框的空状态的对象)并将其添加到items列表中。例如,在您的情况下,它可能只是一个空字符串。为了避免仍然可以将null作为所选值的情况,可以通过调用对我来说仍然没有意义的
cb.getSelectionModel().selectFirst()
在控制器初始化时强制选择。您的
组合框中仍会显示一个“空”值。选择空值意味着什么?如果用户要与它交互,则应适当标记它,例如
。Combobox中没有空值(至少现在是这样)。当尚未选择任何内容时,存在Combobox的状态。但当用户第一次选择某个对象时,用户无法将其选择恢复到以前的状态。要赋予此功能,您应该自己创建一个空值,并将其添加到可能的值列表中。你可以随意命名:空的,没有数据,等等,这就是我已经说过的。从我最初的帖子:“我怀疑你真的想清除当前选择”和我上面的评论:“如果用户要与之交互,那么它应该被适当地标记,例如,
”我的代码示例显示,即使组合框中没有意义,你也可以有一个“空”值,这就是我要说的永远不要添加真正的空值:a)从技术上讲,选择空值会导致清除选择(开放问题,因为这是未指定的-),因此如果空值是包含的项,系统将混淆b)100%确认Benjamin:用户选择“空值”没有意义C)什么是有意义的是清除选择:实现键盘的手势是Ctrl空间(虽然不总是工作,但是,你可能需要一个自定义键绑定)D)考虑使用文本提示来改善用户体验,如果没有任何选择奇怪的,我的系统报告我有java 8更新20,我的代码发布的工作很好。真奇怪。我不确定您的系统报告有Java8更新20是什么意思。你确定你真的在用它来运行代码吗?如果插入
System.out.println(“Java版本为:”+System.getProperty(“Java.version”))输入到代码中并运行它,它是否打印“Java版本是:1.8.0_20”?@BenjaminGale确认了8u20中的IOOB(但是,正如我们所同意的,使用null没有太多意义)可以确认,在Java 8_31上也不可能。添加null值会导致索引越界异常。
cb.getSelectionModel().clearSelection();