Javafx Combox getSelectedIndex返回-1

时间:2017-09-30 09:06:57

标签: java javafx combobox

我是JavaFX的新手,每当我从ComboBox中选择一个项目时,我都会遇到这个奇怪的异常,我在数据库中有一堆记录我正在抓取和将组合框作为String放入,就是当我选择Combobox中的项目时我得到ArrayIndexOutOfBoundsException: -1,有时我可以显示ComboBox所需的信息,有时候我不能,导致这个的原因是什么错误?我该如何解决,帮助将不胜感激?

以下是 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());
        });

    }

1 个答案:

答案 0 :(得分: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, …));

image

完整示例:

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);
    }
}