Вызов SearchableComboBox.getItems().remove() из события OnAction приводит к исключению IndexOutOfBoundsExceptionJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Вызов SearchableComboBox.getItems().remove() из события OnAction приводит к исключению IndexOutOfBoundsException

Сообщение Anonymous »

Я пытаюсь создать проект JavaFX, содержащий несколько экземпляров элемента управления SearchableComboBox из библиотеки ControlsFX, каждый из которых имеет одинаковый список параметров. Когда опция выбрана в поле, она удаляется из других с помощью метода .getItems().remove(). Я сохраняю выбранное значение в переменной, чтобы при выборе нового значения предыдущее значение можно было добавить обратно в другие поля.
При написании этого кода я столкнулся с двумя проблемами:
  • Событие OnAction запускается три раза, устанавливая в поле заданное значение, затем значение NULL, а затем снова возвращаясь к заданному значению. Я написал обходной путь, проверяя значение поля, чтобы увидеть, является ли оно нулевым или уже соответствует предыдущему значению, и не запускает код, если оно истинно.
  • Когда вызывается .getItems().remove(), он генерирует ошибку индекса за пределами допустимой длины.
Технически код работает с точки зрения конечного результата. Однако я предполагаю, что ошибка указывает на то, что я не использую лучшие практики или что-то не так с библиотекой.
Я пробовал использовать Platform.runLater(), но ошибка все равно генерируется. Я также протестировал версию кода с базовым комбобоксом JavaFX, и никаких проблем там не возникло. Есть ли способ избежать ошибки «Индекс выходит за пределы допустимой длины»?
Я написал демонстрационную версию проблемы, чтобы лучше ее понять и предоставить код, воссоздающий ошибку.

Код: Выделить всё

public class HelloController {
@FXML
private SearchableComboBox cb1;
@FXML
private SearchableComboBox cb2;
@FXML
private SearchableComboBox cb3;

private ArrayList comboBoxes;

String strSelected1;
String strSelected2;
String strSelected3;

public void initialize() {
ArrayList strsList = new ArrayList();
strsList.add("A");
strsList.add("B");
strsList.add("C");
strsList.add("D");
strsList.add("E");
strsList.add("F");
strsList.add("G");
strsList.add("H");
cb1.setItems(FXCollections.observableList((ArrayList) strsList.clone()));
cb2.setItems(FXCollections.observableList((ArrayList) strsList.clone()));
cb3.setItems(FXCollections.observableList((ArrayList) strsList.clone()));
comboBoxes = new ArrayList();
comboBoxes.add(cb1);
comboBoxes.add(cb2);
comboBoxes.add(cb3);
}

// get selected value from combobox, remove from other two comboboxes
// re-add previously selected value to combobox
private void readdPreviousAndRemoveSelected(SearchableComboBox cbSelected, String priorSelection) {
System.out.println("Selected Value: " + cbSelected.getValue());
for (SearchableComboBox cb: comboBoxes) {
if (cb != cbSelected) {
System.out.println("Selected Value (Other Box): " + cb.getValue());
if (priorSelection != null) {
Platform.runLater(() -> {
System.out.println("Readd: " + priorSelection);
cb.getItems().add(priorSelection);
});
}
if (cbSelected.getValue() != null)  {
Platform.runLater(() -> {
System.out.println("Remove: " + cbSelected.getValue());
cb.getItems().remove(cbSelected.getValue());
});
}
System.out.println("Size (Other Box): " + cb.getItems().size());
}
}
}

@FXML
private void OnCB1Selected() {
System.out.println("CB1 OnAction: Str: " + strSelected1 + " Box: " + cb1.getValue());
// if statement prevents code from running if value is null or already set
// thus, it prevents the additional calls to the method from doing much
if (cb1.getValue() != null && !Objects.equals(cb1.getValue(), strSelected1)) {
readdPreviousAndRemoveSelected(cb1, strSelected1);
strSelected1 = cb1.getValue();
}
System.out.println("End CB1: STR: " + strSelected1 + " Box: " + cb1.getValue());
}

@FXML
private void OnCB2Selected() {
System.out.println("CB2 OnAction: Str: " + strSelected2 + " Box: " + cb2.getValue());
// if statement prevents code from running if value is null or already set
// thus, it prevents the additional calls to the method from doing much
if (cb2.getValue() != null && !Objects.equals(cb2.getValue(), strSelected2)) {
readdPreviousAndRemoveSelected(cb2, strSelected2);
strSelected2 = cb2.getValue();
}
System.out.println("End CB2: STR: " + strSelected2 + " Box: " + cb2.getValue());
}

@FXML
private void OnCB3Selected() {
System.out.println("CB3 OnAction: Str: " + strSelected3 + " Box: " + cb3.getValue());
// if statement prevents code from running if value is null or already set
// thus, it prevents the additional calls to the method from doing much
if (cb3.getValue() != null && !Objects.equals(cb3.getValue(), strSelected3)) {
readdPreviousAndRemoveSelected(cb3, strSelected3);
strSelected3 = cb3.getValue();
}
System.out.println("End CB3: STR: "  + strSelected3 + " Box: " + cb3.getValue());
}
}
Вот сопровождающий fxml: Спасибо за ваше время и внимание.


Подробнее здесь: https://stackoverflow.com/questions/798 ... -results-i
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»