java - 单击 JavaFX ListView 中的任意位置将返回索引 -1 并崩溃

标签 java javafx

我正在处理一个简单的待办事项列表。一切都工作正常直到现在。我研究了几种保存数据的方法(根本没有 UI 工作),当我来测试这一切时,我注意到我的 ListView 周围有一个蓝色轮廓,点击东西会破坏程序。
有两种情况:
1) 运行程序 -> 点击 ListView 中的任意位置(todo 1 单元格之外)会使程序崩溃
2) 运行程序 -> 点击待办事项单元格 -> 打开待办事项信息屏幕 -> 关闭信息屏幕 -> 点击 ListView 中的任意位置打开待办事项信息屏幕。

这是一张看起来像什么的图片

enter image description here

我得到的错误是:线程“JavaFX应用程序线程”java.lang.IndexOutOfBoundsException中的异常:索引-1超出长度1的范围

 static void selectedIndexListener(ListView<Todo> listView) {
    listView.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            int selectedTodoIndex = listView.getSelectionModel().getSelectedIndex();
            StageController.launchSelectedTodoStage(TodoList.getTodoListInstance().getTodoAtIndex(selectedTodoIndex));
        }
    });
}

然后

 static Todo getTodoAtIndex(int index) {
    return todoList.get(index);
}

我有一个 ObservableList 保存所有待办事项,因此出现错误。

我对 java 很熟悉,但我对 javafx 很陌生。我构建这个程序的原因是练习java,而不是javafx。话虽这么说,我不知道从哪里开始调试。 我只能说,我所做的最后一件事是编写使用 JSON 保存和加载数据的函数。最大的变化是 ListView 在运行程序时填充,就像以前我运行它一样,然后添加数据。然而,当我注释掉加载和保存方法时(即像以前一样在没有初始数据的情况下运行程序),就会发生场景 1(崩溃)。目前我更关心第一种情况而不是第二种情况

我很少在这里发帖,所以如果我应该包含任何内容来帮助您帮助我,请告诉我。

最佳答案

如果没有选择任何内容,则

listView.getSelectionModel().getSelectedIndex()

将返回-1(请参阅 documentation )。因此,在未选择任何内容的情况下,您会收到 ArrayIndexOutOfBoundsException 异常。另一方面,如果您选择某些内容,然后单击空单元格,则选择不会更改,因此您可以获得先前选择的项目的详细信息。

将鼠标点击等同于选择通常不是一个好主意。虽然它们显然相关,但正如您发现的那样,它们不是同一件事。

如果您想处理单元格上的鼠标单击,请使用单元格工厂来定义已注册相应鼠标处理程序的单元格,而不是使用 ListView 本身注册鼠标事件处理程序。所以类似:

listView.setCellFactory(lv -> {
    ListCell<Todo> cell = new ListCell<Todo>() {
        @Override
        protected void updateItem(Todo item, boolean empty) {
            super.updateItem(item, empty);
            setText(item == null ? "" : item.toString());
        }
    };
    cell.setOnMouseClicked(e -> {
        if (! cell.isEmpty()) {
            StageController.launchSelectedTodoStage(cell.getItem());
        }
    });
    return cell ;
});

关于java - 单击 JavaFX ListView 中的任意位置将返回索引 -1 并崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48363375/

相关文章:

java - Guava 缓存覆盖错误

java - Android 中快速变化的位图

java - Android单元测试: Mock context that also returns a looper

java - 我们可以在 Java 6 中使用一些 JavaFX 类吗?

java - 错误: Illegal modifier for parameter

java - 如何在@BlobOutput中动态定义 'path'?

java - 在导出的jar文件中添加fxml文件

javafx - JAVA FX - 在 fxml 中创建 observableHashMap

scala - 鼠标单击并悬停在 javafx2 上的奇怪行为

java - 用于文本输入/javafx 的矩形光标