В моем приложении javafx есть следующие методы:
@FXML
private void addNewWorkerButton(ActionEvent event) {
String name = newWorkerNameTextField.getText();
int wage = Integer.parseInt(newWorkerWageTextField.getText());
allWorks.add(new Work(new Worker(getNextId(), name, wage)));
new FileHandling().writeDataToFileAsJSON(allWorks); //I save the data in JSON
setNamesChoiceBoxes();
}
}
private void setNamesChoiceBoxes() {
ArrayList<String> names = new ArrayList<>();
ArrayList<Worker> workers = new FileHandling().getWorkersDataFromJSONFile(); //I read all Workers objects from JSON
for (Worker i : workers) {
String tmp = i.getName() + " (" + i.getId() + ")";
names.add(tmp);
}
ArrayList<String> searchNames = new ArrayList<>(names);
searchNames.add(0, "All");
ObservableList<String> search = FXCollections.observableList(searchNames);
searchNameChoiceBox.setItems(search);
searchNameChoiceBox.getSelectionModel().selectFirst();
}
private void search() {
int workerID = 0;
String idString = "" + searchNameChoiceBox.getSelectionModel().getSelectedItem();
System.out.println("Search: " + searchNameChoiceBox.getSelectionModel().getSelectedItem());
if (!idString.equals("All")) {
workerID = Integer.parseInt(idString.substring(idString.indexOf("(") + 1, idString.indexOf(")")));
}
}
@Override
public void initialize(URL url, ResourceBundle rb) {
searchNameChoiceBox.setOnAction((event) -> {
search();
});
}
У меня есть поле выбора, содержащее всех рабочих, которые есть в моем файле JSON (searchNameChoiceBox). Когда я добавляю нового работника, я вызываю метод setNamesChoiceBoxes (), который считывает всех работников из файла JSON и обновляет поле выбора. "SetOnAction" вызовет метод search (), который получает здесь значение NULL:
System.out.println("Search: " + searchNameChoiceBox.getSelectionModel().getSelectedItem());
Каким-то образом в этой строке получается значение "NULL", что не должно быть возможным, поскольку в методе setNamesChoiceBoxes () я выбираюпервый вариант ("searchNameChoiceBox.getSelectionModel (). selectFirst ();")
Поиск: Все // Я запустил приложение
Поиск: ноль // Я добавил нового работника
Исключение в потоке "Поток приложения JavaFX" java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: -1 в java.lang.String.substring (неизвестный источник) в controller.Control.search (Control.java): 335) at controller.Control.lambda $ 4 (Control.java:440) в ...
Control.java:335 - это строка:
workerID = Integer.parseInt(idString.substring(idString.indexOf("(") + 1, idString.indexOf(")")));
Control.java:440 - это вызов search () в методе initialize ().
Я не получаю нулевое значение, когда работаю с любым массивом.