【问题标题】:Javafx Combox getSelectedIndex returns -1Javafx Combobox get Selected Index 返回 -1
【发布时间】: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(...)

标签: java javafx combobox


【解决方案1】:

由于这是一个常见的symptom,原因有很多,因此单独检查它可能会有所帮助。从here 看到的示例开始,下面的变体监听组合的SelectionModel 并在TextField 中显示当前选择的值。请注意,当使用 Clear 按钮清除组合的模型时,组合的选定索引变为-1

SingleSelectionModel selectionModel = comboBox.getSelectionModel();
TextField selection = new TextField(String.valueOf(selectionModel.getSelectedIndex()));
selectionModel.selectedIndexProperty().addListener((Observable o) -> {
    selection.setText(String.valueOf(selectionModel.getSelectedIndex()));
});
…
dialogPane.setContent(new VBox(8, textField, datePicker, comboBox, selection, …));

完整示例:

import java.time.LocalDate;
import java.util.Optional;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.Observable;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Dialog;
import javafx.scene.control.DialogPane;
import javafx.scene.control.SingleSelectionModel;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 * @see https://stackoverflow.com/a/46504588/230513
 * @see http://stackoverflow.com/q/44147595/230513
 * @see http://www.javaworld.com/article/2991463/
 */
public class DialogTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Dialog<Results> dialog = new Dialog<>();
        dialog.setTitle("Dialog Test");
        dialog.setHeaderText("Please specify…");
        DialogPane dialogPane = dialog.getDialogPane();
        dialogPane.getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
        TextField textField = new TextField("Name");
        DatePicker datePicker = new DatePicker(LocalDate.now());
        ObservableList<Venue> options =
            FXCollections.observableArrayList(Venue.values());
        ComboBox<Venue> comboBox = new ComboBox<>(options);
        SingleSelectionModel selectionModel = comboBox.getSelectionModel();
        selectionModel.selectFirst();
        TextField selection = new TextField(String.valueOf(selectionModel.getSelectedIndex()));
        selectionModel.selectedIndexProperty().addListener((Observable o) -> {
            selection.setText(String.valueOf(selectionModel.getSelectedIndex()));
        });
        Button clear = new Button("Clear");
        clear.setOnAction((action) -> {
            options.clear();
        });
        Button restore = new Button("Restore");
        restore.setOnAction((action) -> {
            options.clear();
            options.addAll(Venue.values());
            selectionModel.selectLast();
        });
        dialogPane.setContent(new VBox(8, textField, datePicker, comboBox, selection, clear, restore));
        Platform.runLater(textField::requestFocus);
        dialog.setResultConverter((ButtonType button) -> {
            if (button == ButtonType.OK) {
                return new Results(textField.getText(),
                    datePicker.getValue(), comboBox.getValue());
            }
            return null;
        });
        Optional<Results> optionalResult = dialog.showAndWait();
        optionalResult.ifPresent((Results results) -> {
            System.out.println(
                results.text + " " + results.date + " " + results.venue);
        });
    }

    private static enum Venue {Here, There, Elsewhere}

    private static class Results {

        String text;
        LocalDate date;
        Venue venue;

        public Results(String name, LocalDate date, Venue venue) {
            this.text = name;
            this.date = date;
            this.venue = venue;
        }
    }

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

【讨论】:

  • 每当有时出现问题时,我都会想到不正确的同步。
猜你喜欢
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 2019-02-14
  • 2016-08-27
  • 1970-01-01
  • 2016-10-22
相关资源
最近更新 更多