2017-03-15 77 views
0

私のペインの背景色を1秒間設定してから、透明に切り替える必要があります。私はこれを設定して背景色を変更し、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をご覧ください。あなたのキーフレームにです。KeyValueを渡す必要があり、その変更は、キーフレームによって表される時点で発生します。プロパティ、および新しい値:

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は、2つの部分から構成されアニメーション中のある時点でそのプロパティに割り当てられます。

  • 最初のDuration.ZERO(開始)は、背景のプロパティを開始色に設定します。
  • 秒は1000ミリ秒が経過した後に発生し、背景プロパティを再び透明に設定します。

ちなみに、Duration.seconds(1)はもう少し読みやすいかもしれません。

+0

ありがとうございます!これは完全に答えました。私はKeyFramesがどのように動作するはずであるかについて完全にはわかっていませんでした。 –

関連する問題