繁体   English   中英

由于单击按钮而调用JavaFX AnimationTimer时无法启动

[英]JavaFX AnimationTimer doesn't start when it is called as a result of a Button click

我正在尝试向围绕太阳旋转的地球的小动画添加“开始”按钮。 我的问题是,当我单击按钮时,AnimationTimer似乎从未收到过start()调用。

触发单击按钮的事件时,动画计时器应启动,从而开始绘制图形上下文(在画布上)。

我敢肯定我在某个地方犯了一个愚蠢的错误,但是对于我的一生,我无法弄清楚。

这是代码:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.control.Button;
import javafx.animation.AnimationTimer;

public class Orbit extends Application {

    private static int WINDOW_WIDTH  = 500;
    private static int WINDOW_HEIGHT = 500;

    private static int EARTH_RADIUS = 100;
    private static int EARTH_ORBIT_RADIUS = 128;

    private static int SUN_RADIUS = 100;

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

    public void start(Stage stage) {
        stage.setTitle("Orbit");

        Group root = new Group();
        Scene theScene = new Scene(root);
        stage.setScene(theScene);

        Canvas canvas = new Canvas(WINDOW_WIDTH, WINDOW_HEIGHT);

        GraphicsContext gc = canvas.getGraphicsContext2D();

        Image earth = new Image("earth.png", EARTH_RADIUS, EARTH_RADIUS, false, false)
            , sun   = new Image("sun.png", SUN_RADIUS, SUN_RADIUS, false, false)
            , space = new Image("space.png");

        final long startNanoTime = System.nanoTime();

        final AnimationTimer timer = new AnimationTimer() {
            @Override
            public void handle(long currentNanoTime) {
                double t = (currentNanoTime - startNanoTime) / 1000000000.0;

                int centerX = (WINDOW_WIDTH - SUN_RADIUS) / 2
                  , centerY = (WINDOW_HEIGHT - SUN_RADIUS) / 2;

                double x = centerX + EARTH_ORBIT_RADIUS * Math.cos(t)
                     , y = centerY + EARTH_ORBIT_RADIUS * Math.sin(t);

                gc.drawImage(space, 0, 0);
                gc.drawImage(earth, x, y);
                gc.drawImage(sun, centerX, centerY);
            }
        };

        Button btn = new Button("Start");
        btn.setOnMousePressed(actionEvent -> timer.start());

        root.getChildren().addAll(btn, canvas);
        stage.show();
    }
}

您的画布在按钮上方,以防止按钮接收鼠标事件。

您可以:

反转添加组件的顺序,以使按钮出现在画布顶部:

    root.getChildren().addAll(canvas, btn);

或使画布鼠标透明(假设您不想在其上处理鼠标事件):

    canvas.setMouseTransparent(true);

或使用VBox代替Group ,这样组件之间不会相互重叠:

    // Group root = new Group();
    VBox root = new VBox();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM