ActionEvent 中的 JavaFX Thread.Sleep() 或 pause()

Posted

技术标签:

【中文标题】ActionEvent 中的 JavaFX Thread.Sleep() 或 pause()【英文标题】:JavaFX Thread.Sleep() or pause() in ActionEvent 【发布时间】:2021-04-02 22:10:46 【问题描述】:

我是 JavaFX 的新手,每次按下按钮时我都在尝试,first,它会在标签上显示一些信息,然后 换个场景。 实际上一切都很好,但我只是找不到如何在更改场景之前等待特定的时间。

我尝试像这样使用 Thread.sleep() :(它等待正常,但不知何故它不会改变标签的文本)

    @FXML
public void pressButton(ActionEvent event) throws IOException, InterruptedException 
    user = new User(inUsername.getText(),inPassword.getText());
    lLeftBottom.setText(user.getUserInfo());
    Thread.sleep(2000);
    changeScene2(event);

(编辑,感谢Slaw关于pause()的actionEvent问题的解决方案)

我也尝试了JavaFX的暂停方法,但它没有等待,仍然立即跳转另一个场景

    @FXML
public void pressButton(ActionEvent event) throws IOException, InterruptedException 
    user = new User(inUsername.getText(),inPassword.getText());
    PauseTransition pause = new PauseTransition(Duration.seconds(3));
    pause.setOnFinished(e ->
        lLeftBottom.setText(user.getUserInfo());
    );
    pause.play();
    changeScene2(event);

我怎样才能让这个延迟?

【问题讨论】:

是的,谢谢你解决了这个错误。但是我按下按钮它并没有等待,它仍然立即跳转另一个场景 onFinished 处理程序中的代码在暂停后(当暂停结束时)执行,因此您可以向后执行。 非常感谢,我知道暂停现在是如何工作的,这解决了我的问题! 【参考方案1】:

关于您的第一个问题:尝试使用 try catch。适合我。

public static void main(String[] args) 
    System.out.println("test1");
    try 
        Thread.sleep(2000);
     catch (InterruptedException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
    System.out.println("test2");

【讨论】:

谢谢,它正在等待,但不知何故它没有设置标签的文本。当我在 sleep() 上使用 throw 异常时,它会正确等待,但也不会更改标签的文本。 您永远不应该在 JavaFX 应用程序线程上调用 Thread#sleep(...)。该线程必须始终响应(@EgeBULUT) @Slaw 哦,我明白了,谢谢。从现在开始我将使用PauseTransition【参考方案2】:

您已经向后使用了 PauseTransition。如果你想在暂停后改变场景,那就是需要在你的 onFinished 事件处理程序中的部分:

@FXML
public void pressButton(ActionEvent event) throws IOException, InterruptedException 
    user = new User(inUsername.getText(),inPassword.getText());
    PauseTransition pause = new PauseTransition(Duration.seconds(3));
    pause.setOnFinished(e ->
        changeScene2(event);
    );
    lLeftBottom.setText(user.getUserInfo());
    pause.play();

【讨论】:

哦,我现在明白了。非常感谢您解决了我的问题!

以上是关于ActionEvent 中的 JavaFX Thread.Sleep() 或 pause()的主要内容,如果未能解决你的问题,请参考以下文章

Javafx 按钮向 ActionEvent 函数发送参数

JavaFX 学习旅程

如果按下键,则不会触发鼠标交互的 JavaFX 事件

JAVAFX添加按钮事件备忘

JavaFx,@FXML 的问题

javaFX的窗体----css+java