2017-03-15 265 views
0

我需要将我的窗格的背景颜色设置为一秒钟,然后将其切换为透明。我有这个设置来改变背景颜色,使用持续时间为1000ms的TimeLine暂停它,然后切换到透明。JavaFX使用TimeLine暂停程序

时间轴没有暂停,程序飞过它并且背景太快。有人知道怎么修这个东西吗?

由于该项目的范围,我无法使用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); 
       } 

回答

2

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

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

看看constructors of the KeyFrame class。您需要将键值传递给你的关键帧,所以在由关键帧代表的时间点发生了变化:

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

正如你所看到的,一个键值由两个部分组成:一个属性,而新的价值您希望在动画过程中的某个点分配给该属性。

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

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

+0

非常感谢!这完美地回答了它。我不完全确定KeyFrame应该如何工作。 –