JavaFX: ObservableArrayList добавление элементов останавливает приложение - PullRequest
0 голосов
/ 11 октября 2018

В моем приложении 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()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...