2014-10-01 5 views
4

У меня есть этот код в методе запуска:ComboBox странное поведение (JavaFX 8)

ObservableList<StringBuilder> list = FXCollections.observableArrayList(); 
list.add(new StringBuilder("0")); 
list.add(new StringBuilder("1")); 
list.add(new StringBuilder("2")); 
list.add(new StringBuilder("3")); 
list.add(new StringBuilder("4")); 
list.add(new StringBuilder("5")); 
list.add(new StringBuilder("6")); 
list.add(new StringBuilder("7")); 
list.add(new StringBuilder("8")); 
list.add(new StringBuilder("9")); 

ComboBox<StringBuilder> combo = new ComboBox<>(list); 
Button change = new Button("change"); 
change.setOnAction((event) -> { 
    list.set(5, new StringBuilder("-")); 
}); 

BorderPane borderPane = new BorderPane(combo, null, null, change, null); 
Scene scene = new Scene(borderPane); 
primaryStage.setScene(scene); 
primaryStage.show(); 

я начинаю свою программу и выбрать второй пункт, а затем я нажимаю на «изменение» кнопку несколько раз. Ничего не происходит, и это хорошо. Но если я выберу пункт «6» и нажму кнопку «изменить», то comboBox автоматически выбирает следующий элемент («7»). Почему это происходит?

Тогда мы можем изменить строку

list.set(5, new StringBuilder("-");

на

list.remove(5); 

Затем, если выбрать пункт "2" и нажмите кнопку "изменить", то ничего не происходит. И снова, если я выберу пункт «9» и нажмите кнопку «изменить», тогда comboBox автоматически выбирает предыдущий элемент («8»).

Я ожидаю, что если я просто изменю элемент, то есть используйте метод набора списка, тогда comboBox не изменит выбор. Как справиться с этим?

ответ

3

Я не уверен, почему это происходит, это может иметь какое-то отношение к пути ComboBox ручками ObservabeList в нем. Но это невозможно реплицировать, используя ChoiceBox. Не могли бы вы поднять JIRA с командой JavaFX, чтобы они могли посмотреть на нее?

Как поворот, вы можете сделать следующее в своем коде, чтобы исправить это временно:

ComboBox<String> combo = new ComboBox<String>(list); 
Button change = new Button("change"); 
change.setOnAction((event) -> { 
    StringBuilder str = combo.getValue(); 
    list.set(5, new String("-")); 
    combo.setValue(str); 
}); 
2

Вы можете использовать ChoiceBox в этом случае, он работал нормально для меня. Просто замените ComboBox ChoiceBox. Но нажатие кнопки при выборе 5 не обновляет заголовок до «-».

1

Я думаю, что это, вероятно, bugs.openjdk.java.net/browse/JDK-8087838: ComboBox: Root observable list changing causes very strange selection issues, which is sort of fixed on Java 9, for general availablility Sep 2016. См. Также this вопрос

Смежные вопросы