При написании этого кода я столкнулся с двумя проблемами:
- Событие 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());
}
}
Код: Выделить всё
Подробнее здесь: https://stackoverflow.com/questions/798 ... -results-i
Мобильная версия