【发布时间】:2019-03-18 08:31:51
【问题描述】:
我有两个相互交织的多线程问题。
我在使用 Spring Boot 的 JavaFX 桌面应用程序中有一个 SplitPane。左边是 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();
我还更改了顺序,在启动线程后有时间轴。它看起来有所不同,但仍不如预期。
我怎样才能改进我的多线程逻辑并摆脱这种扭曲?
顺便说一句:在实际代码中,我已经在此过程运行时更改了光标,以使其更易于用户理解。
提前谢谢你!
【问题讨论】:
标签: multithreading user-interface javafx