【发布时间】:2017-09-30 09:06:56
【问题描述】:
我是 JavaFX 新手,每当我从 ComboBox 中选择一个项目时,我都会遇到这个奇怪的异常,我在数据库中有一堆记录,我正在获取并作为字符串放入组合框中,问题是当我选择组合框中的项目时,我得到ArrayIndexOutOfBoundsException: -1,有时我可以显示组合框中所需的信息,有时我不能,是什么导致了这个错误?以及如何解决它,将不胜感激?
这是 ComboBox 动作方法:
@FXML
private ComboBox<String> recherche;
@FXML
private void Combo(ActionEvent event) {
Platform.runLater(() -> {
int selectedIndex = this.recherche.getSelectionModel().getSelectedIndex();
System.out.println("**************selected intedx "+selectedIndex); //prints -1 and throws ArrayOutOfBoundsException
ObservableList<String> listPayment = FXCollections
.observableArrayList(PaymentQueries.listOfPayamentDates(listOfData);
recherche.setItems(listPayment);
recherche.setEditable(true);
//for autocompletion
TextFields.bindAutoCompletion(recherche.getEditor(), recherche.getItems());
});
}
我在显示 Combobox 之前调用此方法:
public void reload() {
Platform.runLater(() -> {
clearFields();
ObservableList<String> listEnfant = FXCollections.observableArrayList(EnfantQueries.getData().getNoms());
recherche.setItems(listEnfant);
recherche.setEditable(true);
TextFields.bindAutoCompletion(recherche.getEditor(), recherche.getItems());
});
}
【问题讨论】:
-
你能告诉我们recherche项目的初始化吗?我的意思是你第一次在哪里调用 setItems() ?如果答案在 Combo 方法内,那么您为 selectedIndex 取 -1 的原因是因为您没有内部项目。创建@FXML public void initialize() 方法并将项目设置为组合框
-
不,我使用的是 menuBar,所以每次我点击一个菜单项时,我都会在我的 recherche 组合框上调用 setItems(),我也会在组合框中得到我期望的所有项目,所以它是不是关于没有得到项目,当我实际选择一个项目时,一切正常,当我点击菜单项目时,我正在使用重新加载方法,我将它添加到代码中
-
hmm 出现错误 ArrayIndexOutOfBoundsException + 你是说你可以查看组合框中的所有项目(至少在你选择一个之前)我只能假设你在实际可以之前以某种方式删除了这些项目选择一个或者你以某种方式设置 selectedItem = -1 。为了确保请在打印 selectedIndex 之前打印 recherche.getItem().size() 如果它是 0 那么你需要找出数据插入的问题。如果它不存在搜索如果你在某处设置 selectedIndex = -1
-
如果您可以发布您的问题的工作示例,我可以帮助您快速;)因为我将能够看到整个画面。因为现在例如我看不到'clearFields()'等内部是否有问题。
-
旁白:为什么在看似事件处理程序的地方有
Platform.runLater(...)?