gpt4 book ai didi

JavaFX 使用 TimeLine 暂停程序

转载 作者:行者123 更新时间:2023-11-29 04:33:28 27 4
gpt4 key购买 nike

我需要将 Pane 的背景颜色设置一秒钟,然后将其切换为透明。我已将其设置为更改背景颜色,使用持续时间为 1000 毫秒的时间线暂停它,然后切换为透明。

时间轴没有暂停,程序飞过它并且过快地将背景设置为透明。有人知道如何解决这个问题吗?

由于这个项目的范围,我不能使用 thread.sleep 或类似的东西。

package assign3;

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import javafx.animation.FillTransition;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Question2 extends Application
{

public static final int RED = 1;
public static final int GREEN = 2;
public static final int BLUE = 3;
public static final int ORANGE = 4;

@Override
public void start( Stage obPrimeStage ) throws Exception
{
boolean runGame = true;
int level = 1;
BorderPane obBorder = new BorderPane();
HBox obPane = new HBox();
HBox obStart = new HBox();
Button btRed = new Button("Red");
Button btGreen = new Button("Green");
Button btBlue = new Button("Blue");
Button btOrange = new Button("Orange");
Button btStart = new Button("Start");
Timeline pause = new Timeline();
pause.setCycleCount(1);
pause.getKeyFrames().add(new KeyFrame(Duration.millis(1000)));


obStart.getChildren().add(btStart);
obPane.getChildren().addAll(btRed, btGreen, btBlue, btOrange);
obBorder.setCenter(obPane);
obBorder.setBottom(obStart);
obPane.setAlignment(Pos.CENTER);
obStart.setAlignment(Pos.CENTER);

Scene obScene = new Scene(obBorder, 400, 400);

obPrimeStage.setTitle("Question 2");
obPrimeStage.setScene(obScene);
obPrimeStage.show();

ArrayList<Integer> colours = new ArrayList<>();
ArrayList<Integer> guesses = new ArrayList<>();

btStart.setOnAction((ActionEvent start) -> {
for(int i = 0; i <= level; i++)
{
int randomColour = (int)((Math.random() * 4) + 1);
randomColour = 1;

if(randomColour == RED)
{
obBorder.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
pause.play();
obBorder.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)));
colours.add(RED);
}

最佳答案

您正在使用 Timeline 作为 Thread.sleep 的替代品。这不是时间线的工作方式。

当您在动画上调用 play() 时,它会在后台启动动画并立即返回。

看看 constructors of the KeyFrame class .您需要将 KeyValue 传递给您的 KeyFrame,以便在 KeyFrame 表示的时间点发生变化:

pause.getKeyFrames().add(new KeyFrame(Duration.ZERO,
new KeyValue(obBorder.backgroundProperty(),
new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)))));

pause.getKeyFrames().add(new KeyFrame(Duration.millis(1000),
new KeyValue(obBorder.backgroundProperty(),
new Background(new BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)))));

如您所见,KeyValue 由两部分组成:一个属性,以及您希望在动画期间的某个时刻分配给该属性的新值。

  • 第一个位于 Duration.ZERO(开始),它将背景属性设置为您的起始颜色。
  • 第二次发生在 1000 毫秒后,再次将背景属性设置为透明。

顺便说一句,您可能会发现 Duration.seconds(1) 更具可读性。

关于JavaFX 使用 TimeLine 暂停程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42814765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com