В моем приложении JavaFX я пытаюсь установить choicebox
элементов (около 90 строковых элементов) следующим образом:
private fun initChoiceBox(choiceBox: ChoiceBox<String>, elements: List<String>) {
val detectLabel = "Detect language"
choiceBox.items = FXCollections.observableArrayList(detectLabel)
choiceBox.selectionModel.selectFirst()
choiceBox.items.addAll(elements) // hanging is here
}
Вышеприведенный метод вызывается из javafx.concurrent.Task
# onSucceeded:
private fun initializeSelectLanguage() {
val task = GetSupportedLanguagesTask()
task.onSucceeded = EventHandler { _ ->
val value = task.value
val elements = value.langs.map { it.value } // around 90 elements in my case
initChoiceBox(selectLanguage, elements)
initChoiceBox(translationLanguage, elements)
}
task.onFailed = EventHandler {
println(it.source.message) // todo
}
executor.submit(task)
}
Как я могу исправить это замораживание?Как я могу обновить свое представление, если в него добавлено слишком много элементов?
Обновление 1
Я создаю свой ChoiceBoxes
вот так (используя fxml
файлов):
<HBox>
<StackPane>
<ChoiceBox fx:id="selectLanguage"/>
</StackPane>
</HBox>
Корень StackPane
файла fxml
указывает на класс контроллера следующим образом:
fx:controller="com.pany.view.Controller"
И контроллеринициализирует аналогично этому примеру:
class Controller : Initializable, Disposeable {
@FXML
private lateinit var selectLanguage: ChoiceBox<String>
@FXML
lateinit var translationLanguage: ChoiceBox<String>
private val executor = Executors.newFixedThreadPool(1)
override fun initialize(location: URL?, resources: ResourceBundle?) {
initializeSelectLanguage() // method is already posted above
}
override fun dispose() {
executor.shutdownNow()
}
}