我必须执行一个复杂的过程来加载图像,这需要花费大量时间,并且在此过程运行时,我想通知用户该过程实际上在后台运行。
为此,我已经放弃了动画效果,因为它必须实际上位于不同线程的背景中,所以我想要的只是一个大红色文本,上面写着“正在加载”。 。请稍候”。
简化示例:
主要:
public class Controller {
@FXML
StackPane mainPane;
Text text;
public void initialize(){
text = new Text();
text.setText("please wait");
text.setVisible(false);
mainPane.getChildren().add(text);
}
public void handleMouseClick(){
text.setVisible(true);
longProcess();
text.setVisible(false);
}
public void longProcess(){
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Fxml文件:
<?import javafx.scene.layout.StackPane?>
<StackPane fx:controller="sample.Controller"
xmlns:fx="http://javafx.com/fxml"
fx:id="mainPane"
onMouseClicked="#handleMouseClick">
</StackPane>
因此,这段代码创建了一个简单的堆栈窗格,并向其中添加了不可见的文本,然后单击鼠标应首先显示该文本,然后使线程进入睡眠状态(类似于我的漫长过程),然后使该文本再次不可见,但这只会使线程睡眠,由于某种原因不显示文本。
答案 0 :(得分:0)
编辑:
由于kleopatra指出旧代码段不起作用,因此我搜索了该方法并找到了以下答案:
“以下代码将暂停并更改标签中的值(全面披露,我正在重复使用为另一个问题编写的代码):”
旧:
下面的代码对您有帮助吗?
while(!node.isVisible()){
System.out.println("waiting...");
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
答案 1 :(得分:0)
将您的handleMouseClickMethod更改为这样,它应该可以工作
public void handleMouseClick(){
int delayTime = 10;//Set this to whatever you want your delay in Seconds
Label text = new Label("please wait");
mainPane.getChildren().add(text);
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(()->
Platform.runLater(()->mainPane.getChildren().remove(text)), delayTime, 1, TimeUnit.SECONDS);
}