У меня есть две проблемы многопоточности, которые переплетаются.
У меня есть SplitPane в настольном приложении JavaFX с использованием весенней загрузки.Слева TreeView, справа TabPane.В начале разделитель SplitPane находится на правом краю, скрывая панель TabPane.Когда пользователь выбирает элемент в дереве, две вещи должны происходить параллельно:
Сначала, в зависимости от выбора, создается около 10 вкладок.Вкладки различаются в зависимости от выбранного объекта.Каждая вкладка показывает подробные данные, связанные с выбранным объектом.Большинство вкладок содержат диаграммы, а также текст.
Во-вторых, так как настройка вкладок занимает несколько секунд - данные должны быть извлечены из БД - идея состояла в том, чтобы медленно «свернуть» разделитель TabPane влево, скрывая дерево.Это создает у пользователя впечатление, что приложение все еще работает, и делает переход более мягким.Мне не нравится ждать, ждать, .. взрыв!
Одна проблема в том, что временная шкала (см. Ниже), которую я использую, заикается, и я не могу заставить ее работать параллельно параллельно для настройки вкладок.
Создание вкладок выполняется в отдельной задаче, и каждый создатель вкладок использует Platform.runLater()
.Вторая проблема в том, что я не уверен, является ли это лучшим способом кодирования этого.Я имею в виду, что почти все вкладки скрыты верхней, но все вкладки создаются одна за другой в потоке приложения.
Другими словами, псевдокод будет выглядеть примерно так:
KeyValue keyValue = new KeyValue(splitPane.getDividers().get(0).positionProperty(), 0.1);
Timeline timeline = new Timeline(new KeyFrame(Duration.millis(300), keyValue));
timeline.play();
Task task = new Task<Void>() {
@Override public Void call() {
Platform.runLater(()-> {
createTabA();
}
..
Platform.runLater(()-> {
createTabZ();
}
return null;
}
};
Thread thread = new Thread(task);
thread.setDaemon(true);
thread.start();
Я также изменил порядок, имея временную шкалу после запуска Thread.Это выглядит по-другому, но все же не так, как ожидалось.
Как я могу улучшить свою многопоточную логику и избавиться от бикинга?
Кстати: в реальном коде я уже меняю курсор, когдаэтот процесс выполняется, чтобы сделать его более удобочитаемым для пользователя.
Заранее спасибо!