点击弹出窗口时,JavaFX 8过滤的ComboBox会抛出IndexOutOfBoundsException

时间:2016-09-26 21:32:35

标签: java javafx combobox javafx-8 indexoutofboundsexception

我正在运行Java 8u102。我有一个模态窗口,其中包含Combobox,其项目是从字符串列表创建的FilteredListComboBox是可编辑的,以便用户可以输入文本(自动转换为大写)。然后过滤ComboBox弹出窗口中的项目,以便仅保留以输入文本开头的项目。这很有效。

问题是,当您单击已过滤弹出窗口中的项目时,所选项目将在组合框编辑器中正确显示,弹出窗口将关闭,但会抛出IndexOutOfBoundsException,可能从代码开始在行 - stage.showAndWait()创建了窗口。以下是运行ComboBox的代码。

有关解决方案的任何建议吗?我计划在组合框中添加更多功能,但我想首先处理这个问题。感谢。

  FilteredList<String> filteredList = 
     new FilteredList(FXCollections.observableArrayList(myStringList), p -> true);
  cb.setItems(filteredList);
  cb.setEditable(true);

  // convert text entry to uppercase
  UnaryOperator<TextFormatter.Change> filter = change -> {
     change.setText(change.getText().toUpperCase());
     return change;
  };
  TextFormatter<String> textFormatter = new TextFormatter(filter);
  cb.getEditor().setTextFormatter(textFormatter);

  cb.getEditor().textProperty().addListener((ov, oldValue, newValue) -> {
     filteredList.setPredicate(item -> {
         if (item.startsWith(newValue)) {
             return true; // item starts with newValue
         } else {
            return newValue.isEmpty(); // show full list if true; otherwise no match
         }
     });
  });

1 个答案:

答案 0 :(得分:2)

问题与this question中的问题相同:您可以将textProperty上的侦听器内容包装到Platform.runLater块中。

cb.getEditor().textProperty().addListener((ov, oldValue, newValue) -> {
    Platform.runLater(() -> {
        filteredList.setPredicate(item -> {
            if (item.startsWith(newValue)) 
                return true; // item starts with newValue
             else 
                return newValue.isEmpty(); // show full list if true; otherwise no match
        });
    });
});

或者使用ternary operator的简短形式:

cb.getEditor().textProperty().addListener((ov, oldValue, newValue) -> Platform.runLater(
        () -> filteredList.setPredicate(item -> (item.startsWith(newValue)) ? true : newValue.isEmpty())));