关于 javafx 中的 PauseTransition

Posted

技术标签:

【中文标题】关于 javafx 中的 PauseTransition【英文标题】:About PauseTransition in javafx 【发布时间】:2020-09-23 19:26:52 【问题描述】:

我创建了一个 VBox(根)并在其中添加了一些 Button。当我单击带有文本“单击”(button_to_click)的按钮时,另外十个按钮(具有十个元素的按钮数组)会将背景颜色更改为“红色”。我希望每个按钮每秒更改其背景颜色。我使用 PauseTransition 来做到这一点,但它没有用。这是我的代码

package sample;

import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.scene.control.*;
import javafx.util.Duration;

public class Main extends Application 
    @Override
    public void start(Stage primaryStage) throws Exception

        VBox root = new VBox();

        Button button_to_click = new Button("Click");

        Button[] buttons = new Button[10];

        root.getChildren().add(button_to_click);

        for(int i = 0; i <= 9; i++)
            buttons[i] = new Button(""+i);
            root.getChildren().add(buttons[i]);
        

        button_to_click.setOnAction(e->
            for(int i = 0; i <= 9; i++)
                buttons[i].setStyle("-fx-background-color:red");
                PauseTransition pause = new PauseTransition(Duration.seconds(1));
                pause.play();
            
        );


        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    


    public static void main(String[] args) 
        launch(args);
    

所有按钮同时更改其背景颜色,这不是我想要的。

【问题讨论】:

【参考方案1】:

您将 PauseTransition 视为 Thread.sleep 调用。但是 PauseTransition 不是这样工作的。

即使它是相同的,睡眠调用也不会做你想做的事。 JavaFX 与大多数用户界面工具包一样,是单线程的,因此睡眠调用会挂起应用程序。

暂停转换发生在后台线程中。您想要的是在暂停时更改按钮的颜色finishes:

button_to_click.setOnAction(e -> 
    for (int i = 0; i <= 9; i++) 
        Button button = buttons[i];

        PauseTransition pause = new PauseTransition(Duration.seconds(i));
        pause.setOnFinished(
            f -> button.setStyle("-fx-background-color:red"));
        pause.play();
    
);

请注意,我已将 PauseTransition 的持续时间从 seconds(1) 更改为 seconds(i)。这不是最有效的方法,但它需要对现有代码的更改最少。它将导致每个按钮的setStyle 方法在i 秒过去后被调用。

【讨论】:

以上是关于关于 javafx 中的 PauseTransition的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SVG 中的 feGaussianBlur 转换为 JavaFX 中的 GaussianBlur 效果?

我正在编写一个 javafx 自定义 LoginModule 并收到以下关于 javafx 权限的 AccessControlException。这是政策文件问题吗?

JavaFX多项任务

JavaFX WebView:使用loadContent()链接到文档中的锚点不起作用

JavaFX 2.0 像 MenuItem 一样激活菜单

Javafx 8:在初始化方法中填充 TableView