当前位置: 首页 > 知识库问答 >
问题:

Javafx钟摆动画-为什么我在场景中看不到我的圆?

元鸿波
2023-03-14

Java程序。使用最新版本的eclipse和java。程序正常工作,但是我不明白为什么我看不到钟摆底部的圆。程序应该把钟摆显示为一条连接顶部和底部圆圈的线。我已经尝试了setFill()和setStroke()代码,但仍然无法解决这个问题...可能是一些小而简单的东西,但我错过了。请让我知道什么在我面前!

import javafx.animation.PathTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Arc;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Ch15PA2 extends Application {
    
    public void start(Stage primaryStage) {
        
        BorderPane pane = new BorderPane();
        VBox vbox = new VBox();
        pane.getChildren().add(vbox);
        
        Pendulum pendulum = new Pendulum(500, 300);
        pane.setCenter(pendulum);   
        
        Scene scene = new Scene(pane,500,500);
        primaryStage.setTitle("Chapter 15 Programming Assignemnt 2");
        primaryStage.setScene(scene);
        pendulum.resume();
        primaryStage.show();
        
        scene.setOnKeyPressed(e -> {
            switch (e.getCode()) {
            case UP: pendulum.increase(); break;
            case DOWN: pendulum.decrease(); break;
            case R: pendulum.resume(); break;
            case S: pendulum.stop(); break;
            }
        });
    }

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

}

class Pendulum extends Pane {
    private double w=300;
    private double h;
    
    PathTransition pt;
    Circle topCircle = new Circle();
    Circle bottomCircle = new Circle();
    Line line;
    Arc arc;
    
    public Pendulum(double width,double height) {
        w = width;
        h = height;
        
        arc = new Arc(w/2,h*.8,w*.15,w*.15,180,180);
        topCircle = new Circle(arc.getCenterX()-arc.getRadiusX(),arc.getCenterY(),10);
        bottomCircle = new Circle(arc.getCenterX(),arc.getCenterY()-h/2,bottomCircle.getRadius()/2);
        arc = new Arc(topCircle.getCenterX(),topCircle.getCenterY(),w/2,h/2,240,60);
        arc.setFill(Color.TRANSPARENT);
        line = new Line(topCircle.getCenterX(),topCircle.getCenterY(),bottomCircle.getCenterX(),bottomCircle.getCenterY());
        pt = new PathTransition();
        pt.setDuration(Duration.seconds(2.0));
        pt.setPath(arc);
        pt.setNode(bottomCircle);
        pt.setOrientation(PathTransition.OrientationType.NONE);
        pt.setCycleCount(PathTransition.INDEFINITE);
        pt.setAutoReverse(true);
        topCircle.setStroke(Color.BLACK);
        topCircle.setFill(Color.BLACK);
        bottomCircle.setStroke(Color.BLACK);
        bottomCircle.setFill(Color.BLACK);
        line.setStroke(Color.BLACK);
        line.endXProperty().bind(bottomCircle.translateXProperty().add(bottomCircle.getCenterX()));
        line.endYProperty().bind(bottomCircle.translateYProperty().add(bottomCircle.getCenterY()));

        getChildren().add(line);
        getChildren().add(bottomCircle);
        getChildren().add(topCircle);
        getChildren().add(arc);
        
    }
    
    public void increase() {
        pt.setRate(pt.getRate()+1);
    }
    
    public void decrease() {
        pt.setRate(pt.getRate()-1);
    }
    
    public void resume() {
        pt.play();
    }
    
    public void stop() {
        pt.stop();
    }
}

共有1个答案

章景同
2023-03-14

您将bottomCircle的半径设置为零。

首先你要:

Circle bottomCircle = new Circle();

它创建了一个带有centerX=0centerY=0和(重要的是)半径=0的圆圈。然后在构造函数中您执行:

bottomCircle = new Circle(arc.getCenterX(),arc.getCenterY()-h/2,bottomCircle.getRadius()/2);

由于底部圆圈.getRadius() 返回 0,因此这会将底部圆圈重新初始化为半径为 0 的圆。由于半径为零,因此没有实际的圆可看。

由于您唯一的构造函数同时初始化 topCirclebottomCircle,因此将它们与它们的声明内联初始化是没有意义的(因为无论如何,您只需立即替换这些对象)。只需将它们声明为

Circle topCircle;
Circle bottomCircle;

这将为您的当前代码提供一个空指针异常,提醒您将bottomCircle.radius设置为bottomCircle.radius/2几乎肯定不是您想要做的。

一般来说,给某个值赋值,然后立即给它另一个值是令人困惑的。你可以这样做

class Pendulum extends Pane {
    private double w;
    private double h;

    PathTransition pt;
    Circle topCircle;
    Circle bottomCircle;
    Line line;
    Arc arc;

    public Pendulum(double width,double height) {
        w = width;
        h = height;

//        arc = new Arc(w/2,h*.8,w*.15,w*.15,180,180);
        topCircle = new Circle(w/2-w*.15,h*.8,10);
        bottomCircle = new Circle(w/2,h*.8-h/2,5);
        arc = new Arc(topCircle.getCenterX(),topCircle.getCenterY(),w/2,h/2,240,60);
        arc.setFill(Color.TRANSPARENT);
        
        // ...

    }

    // ...
}

 类似资料:
  • 我在第一个场景上有一个简单的按钮,应该会导致第二个场景。当我点击按钮时,它改变场景,但只显示一个空白屏幕。如果我关闭原始舞台,然后显示一个包含新场景的新舞台,它会正常工作,但我不想打开一个新窗口。 这是我的控制器类: 主类:

  • 我为浏览按钮下载了一个图像。我把它放在maven项目中的src/main/Resources文件夹中。在我的Browse Action中,这里是我的类代码: 问题是,当我试图通过Browse.class.getResource(…)访问图像时,构造函数中会出现空值。我尝试过在文件名之前使用“/”,但在文件名中没有它-也只是空文件名,我得到了相同的结果。这是我的pom文件: 我不知道错误是否在我的p

  • 以前它工作正常,但现在一切都很慢,而且我没有看到TextField,在层次结构中选择游戏对象时,在编辑器窗口中显示它需要将近5秒的时间。 在此之前,一切都很快,并在编辑器窗口中显示整个层次结构。 现在它是空的: 我从这个问题中得到了答案: 可通过计算机搜索的

  • 这是:“Parent root=fxmlloader.load(getClass().getResource(”sample.fxml“));” 我不明白剩下的部分,所以我希望你能轻松地解决这个问题:)

  • 当我运行(Windows 7命令行)时: C:\rest-app\src\main\java\com\mycompany\app\test>java org.testng.testng testng.xml Suite1运行的测试总数:0,失败:0,跳过:0 ================================================== 此时我的testng.xml文件如下所

  • 我已经使用开发人员沙盒帐户构建了一个集成。我最近将我的应用程序升级为live,并将我的生产环境配置为使用新的集成id和secret以及live Docusign url。 但是,当我尝试在应用程序的帐户中创建oauth连接时,我的服务器会获取一个代码,将客户端重定向到Docusign以进行身份验证,但Docusign登录屏幕显示错误“没有向Docusign注册的重定向URI”。事实并非如此-我的开