如何使JavaFX在运行下一行代码之前等待节点完成配置

时间:2019-01-29 12:07:51

标签: java javafx

我必须执行一个复杂的过程来加载图像,这需要花费大量时间,并且在此过程运行时,我想通知用户该过程实际上在后台运行。
为此,我已经放弃了动画效果,因为它必须实际上位于不同线程的背景中,所以我想要的只是一个大红色文本,上面写着“正在加载”。 。请稍候”。
简化示例:
主要:

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>

因此,这段代码创建了一个简单的堆栈窗格,并向其中添加了不可见的文本,然后单击鼠标应首先显示该文本,然后使线程进入睡眠状态(类似于我的漫长过程),然后使该文本再次不可见,但这只会使线程睡眠,由于某种原因不显示文本。

2 个答案:

答案 0 :(得分:0)

编辑:

由于kleopatra指出旧代码段不起作用,因此我搜索了该方法并找到了以下答案:

  

“以下代码将暂停并更改标签中的值(全面披露,我正在重复使用为另一个问题编写的代码):”

     

https://stackoverflow.com/a/26454506/10971694

下面的代码对您有帮助吗?

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);
}