0

私は非常に奇妙な動作に出くわしました (以下のコードで示されています-コピーして貼り付けるだけで、自分の目でそれを目撃する準備が整います!)。再生ボタンを押すと、メイン メニューがフェードアウトし、オプション メニューが表示されます。「戻る」ボタンを押すと、メイン メニューが再び表示されます。ここでの問題:再生ボタンをもう一度押す..メニューは期待どおりにフェードアウトしませんが、すぐに消え、オプションメニューが期待どおりに表示されます.つまり、アニメーションが2回目にトリガーされると、正しくレンダリングされません! !

デモンストレーションの目的で、再生ボタンとまったく同じことを行う「オプション」ボタンを追加しましたが、アニメーションがわずかに異なります(メインメニューをフェードアウトする代わりに縮小します)。このアニメーションは常に正しく動作します。

この異端の振る舞いを説明できるjavaFX 2の専門家はいますか? これはバグですか..または私が見逃したものですか?

前もって感謝します!これがコードです..

package strangeFx;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application{  

    @Override
    public void start(Stage stage) throws Exception {
        Scene scene = new Scene(new StartScreen());
        stage.setScene(scene);
        stage.show();
    }

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


  }

そしてメインウィンドウクラス

package strangeFx;

import javafx.animation.*;
import javafx.event.*;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import javafx.util.Duration;
import cls.island.utils.TimeLineExt;

public class StartScreen extends Group {

  private static final double ANIM_DURATION = 200D;

    VBox mainBtns =  new VBox();
VBox optionBtns =  new VBox();

     /**
 * Initializes two group of buttons. the "main" group and "options" group.
 * Initially only the menu group  is displayed. By pressing the "options" button
 * the menu group will be removed and replaced by the options with a small animation! 
 * When the "play" button is pressed the menu group will be removed and replaced by
 * the options button, using a different animation
 *
 */
public StartScreen() {
    mainBtns.setFillWidth(true);
    createOptionButtonGroup();
    createStartButton(mainBtns);
    createoptionsButton(mainBtns);
    createQuitButton(mainBtns);
    getChildren().add(mainBtns);
}

private void createOptionButtonGroup() {
    Button button = new Button("Back");
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            goToMain();
        }
    });
    button.setMaxWidth(Double.MAX_VALUE);
    optionBtns.getChildren().add(button);
}

private void createStartButton(Pane buttonGroup) {
    Button button = new Button("Play");
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            fadeAndGoToOptions();
        }
    });
    button.setMaxWidth(Double.MAX_VALUE);
    buttonGroup.getChildren().add(button);
}

private void createQuitButton(Pane buttonGroup) {
    Button button = new Button("Quit");
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            System.exit(0);
        }
    });
    button.setMaxWidth(Double.MAX_VALUE);
    buttonGroup.getChildren().add(button);
}

private void createoptionsButton(Pane buttonGroup) {
    Button button = new Button("Options");
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            goToOptions();
        }
    });
    button.setMaxWidth(Double.MAX_VALUE);
    buttonGroup.getChildren().add(button);
}

public void goToOptions() {
    Timeline timeline = new Timeline();
    timeline.getKeyFrames().add(new KeyFrame(new Duration(ANIM_DURATION), new KeyValue(mainBtns.scaleXProperty(), 0),
            new KeyValue(mainBtns.scaleYProperty(),0)));
    timeline.setOnFinished(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            StartScreen.this.getChildren().remove(mainBtns);
            mainBtns.scaleXProperty().set(1);
            mainBtns.scaleYProperty().set(1);
            Timeline timeline = new Timeline();
            optionBtns.scaleXProperty().set(0);
            optionBtns.scaleYProperty().set(0);
            StartScreen.this.getChildren().add(optionBtns);
            timeline.getKeyFrames().add(new KeyFrame(new Duration(ANIM_DURATION), new KeyValue(optionBtns.scaleXProperty(), 1),
                    new KeyValue(optionBtns.scaleYProperty(),1)));
            timeline.play();

        }
    });
    timeline.play();

}

public void goToMain() {
    TimeLineExt timeline = new TimeLineExt();
    timeline.getKeyFrames().add(new KeyFrame(new Duration(ANIM_DURATION), new KeyValue(optionBtns.scaleXProperty(), 0),
            new KeyValue(optionBtns.scaleYProperty(),0)));
    timeline.setOnFinished(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            StartScreen.this.getChildren().remove(optionBtns);
            optionBtns.scaleXProperty().set(1);
            optionBtns.scaleYProperty().set(1);
            Timeline timeline = new Timeline();
            mainBtns.scaleXProperty().set(0);
            mainBtns.scaleYProperty().set(0);
            StartScreen.this.getChildren().add(mainBtns);
            timeline.getKeyFrames().add(new KeyFrame(new Duration(ANIM_DURATION), new KeyValue(mainBtns.scaleXProperty(), 1),
                    new KeyValue(mainBtns.scaleYProperty(),1)));
            timeline.play();
        }
    });
    timeline.play();
}

/**
 * This is where the problematic behavior occurs, but only when this animation is triggered 
 * for second time! The first time this animation runs and animates properly!
 * The correct animation is to 1. 
 */
public void fadeAndGoToOptions() {
    Timeline timeline = new Timeline();
    timeline.getKeyFrames().add(new KeyFrame(new Duration(1000), new KeyValue(this.opacityProperty(),0)));
    timeline.setOnFinished(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            getChildren().remove(mainBtns);
            StartScreen.this.opacityProperty().set(100);
            Timeline timeline = new Timeline();
            optionBtns.scaleXProperty().set(0);
            optionBtns.scaleYProperty().set(0);
            StartScreen.this.getChildren().add(optionBtns);
            timeline.getKeyFrames().add(new KeyFrame(new Duration(ANIM_DURATION), new KeyValue(optionBtns.scaleXProperty(), 1),
                    new KeyValue(optionBtns.scaleYProperty(),1)));
            timeline.play();
            }
        });
        timeline.play();
    }

}
4

1 に答える 1