JavaFX 11 可编辑组合框抛出 IndexOutOfBoundsException

标签 java javafx-11

我一直在努力为可编辑的 ComboBox 实现事件监听器这会将编辑的项目添加到应用程序中列表的末尾,但这会抛出 IndexOutOfBoundsException提交编辑的项目时。我不明白为什么会这样。
因此,我创建了一个简化的应用程序,如下所示,并尝试将添加编辑项目的代码包含在 Platform.runLater() 中。阻止但问题仍然存在。
有人可以建议可能导致此异常的原因吗?
非常感谢。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

public class ComboBoxTest extends Application {
    ComboBox<String> cbItems;
    Label lblResponse;

    public static void main(String[] args) {
        launch(args);
    }

    public void start(Stage stage) {
        stage.setTitle("ComboBox Demo");
        FlowPane root = new FlowPane(10, 10);
        root.setAlignment(Pos.TOP_CENTER);
        Scene scene = new Scene(root, 240, 120);
        stage.setScene(scene);
        lblResponse = new Label();
        ObservableList<String> items =
                FXCollections.observableArrayList("item1", "item2", "item3", "item4", "item5");
        cbItems = new ComboBox<String>(items);
        cbItems.setValue("item1");
        cbItems.setEditable(true);
        lblResponse.setText("Selected item is " + cbItems.getValue());

        // Listen for action events on the combo box.
        cbItems.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent ae) {
                lblResponse.setText("Selected item is " + cbItems.getValue());

                //add the modified item to the end of the list
                int i = cbItems.getSelectionModel().getSelectedIndex();
                if(!items.get(i).equals(cbItems.getValue())){
                    items.add(cbItems.getValue());
                }
            }
        });
        root.getChildren().addAll(cbItems, lblResponse);
        stage.show();
    }
}

最佳答案

看看[开始]堆栈跟踪......

Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 5
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:359)
    at java.base/java.util.ArrayList.get(ArrayList.java:427)
    at javafx.base/com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89)
    at jfxprjct/jfxtests.ComboBoxTest$1.handle(ComboBoxTest.java:52)
现在查看文件 ComboBoxTest.java 中的第 52 行.
(请注意,它可能是堆栈跟踪中的不同行号。)
对我来说,这是第 52 行
if(!items.get(i).equals(cbItems.getValue())){
换句话说,i 的值是 -1 (减一)。和 iif 之前的行中被赋值陈述。
int i = cbItems.getSelectionModel().getSelectedIndex();
换句话说,有 选定的索引。所以你应该首先检查i的值并且不假设它是一个有效的索引值。
但是,更好的条件(在我看来)是
if(!cbItems.getItems().contains(cbItems.getValue())){
那么您根本不需要选定的索引。

关于JavaFX 11 可编辑组合框抛出 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66062626/

相关文章:

eclipse - 使用 Java 11 在 Eclipse 中混合模块化和非模块化开发

java - 如何使用 pdfbox(或其他开源 Java 库)从 PDF 文件中提取颜色配置文件

java - 使用 Vert.x 事件总线 'locally' (java, single jvm) 时是否可以避免序列化?

java - 无法生成跨平台 javaFX 应用程序

java - 如何将 ObservableList 转换为 ObservableSet

JavaFX 模块化应用程序,java.lang.module.FindException : Module javafx. 未找到控件(Java 11,Intellij)

JavaFX 11 : IllegalAccessError when creating Label

java - 即使测试失败,如何始终在 Jenkins Groovy 管道中写入 .csv 数据文件

java - 如何将包图标添加到arraylist

java - Java中不同类型的线程安全集