我是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());
});
}
答案 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, …));
完整示例:
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);
}
}