Mr. Feng in Ginlin 2024-08-18 21:53 采纳率: 40%
浏览 29

为什么我的JAVAFX程序报错?

为什么我的JAVAFX程序,明明代码语法都没有问题,却编译错误?
当我debug程序后,总是获得:“Exception in Application start method”的报错。
我用的是JAVASE-17和javafx-sdk-22.02。程序代码如下:

package application;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;

public class Main extends Application {

    private double anchorX, anchorY;
    private double anchorAngleX = 0;
    private double anchorAngleY = 0;

    private final Rotate rotateX = new Rotate(0, Rotate.X_AXIS);
    private final Rotate rotateY = new Rotate(0, Rotate.Y_AXIS);
    private final Translate cameraTranslate = new Translate(0, 0, -500);

    @Override
    public void start(Stage primaryStage) {
        // Create a 3D box
        Box box = new Box(100, 100, 100);
        PhongMaterial material = new PhongMaterial(Color.BLUE);
        box.setMaterial(material);

        // Create a camera
        PerspectiveCamera camera = new PerspectiveCamera(true);
        camera.getTransforms().addAll(cameraTranslate, rotateX, rotateY);

        Group root = new Group();
        root.getChildren().addAll(box, camera);

        Scene scene3D = new Scene(root, 800, 600);
        scene3D.setFill(Color.BLACK);
        scene3D.setCamera(camera);

        // Handle mouse events for camera rotation
        scene3D.setOnMousePressed(event -> {
            anchorX = event.getSceneX();
            anchorY = event.getSceneY();
            anchorAngleX = rotateX.getAngle();
            anchorAngleY = rotateY.getAngle();
        });

        scene3D.setOnMouseDragged(event -> {
            rotateX.setAngle(anchorAngleX - (anchorY - event.getSceneY()));
            rotateY.setAngle(anchorAngleY + (anchorX - event.getSceneX()));
        });

        scene3D.setOnScroll(event -> {
            double delta = event.getDeltaY();
            cameraTranslate.setZ(cameraTranslate.getZ() + delta);
        });

        // Create a 2D target icon
        ImageView targetIcon = new ImageView(new Image("target.png")); // Replace with your image file
        targetIcon.setFitWidth(40);
        targetIcon.setFitHeight(40);

        // Alternatively, you could use a simple circle if you don't have an image:
        // Circle targetIcon = new Circle(20, Color.RED);
        // targetIcon.setStroke(Color.BLACK);

        // StackPane to hold both the 3D scene and the 2D icon
        StackPane stackPane = new StackPane();
        stackPane.getChildren().addAll(scene3D.getRoot(), targetIcon);

        // Ensure the target icon stays centered
        StackPane.setAlignment(targetIcon, javafx.geometry.Pos.CENTER);

        // Create the main scene and add the StackPane
        Scene scene = new Scene(stackPane, 800, 600);

        primaryStage.setTitle("Fixed Target Icon Example");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-08-18 21:55
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    问题分析

    用户在使用JavaFX开发程序时遇到了编译错误,报错信息为“Exception in Application start method”。尽管代码语法没有问题,但程序在启动时仍然报错。用户使用的环境是JavaSE-17和javafx-sdk-22.02。

    解决方案

    1. 检查模块依赖

    JavaFX应用程序需要显式声明模块依赖。在Java 9及更高版本中,模块系统要求明确声明所需的模块。用户可能需要在其项目中添加对JavaFX模块的依赖。

    2. 检查资源文件路径

    用户在代码中使用了图像资源(target.png),需要确保该资源文件路径正确且文件存在。

    3. 检查JavaFX库的正确配置

    确保JavaFX库已正确配置在项目中,包括在IDE或构建工具(如Maven或Gradle)中正确引用JavaFX SDK。

    详细步骤

    1. 添加模块依赖

    在模块描述文件(module-info.java)中添加对JavaFX模块的依赖。如果项目中没有module-info.java文件,需要创建一个:

    module application {
        requires javafx.controls;
        requires javafx.graphics;
        requires javafx.base;
        requires javafx.media;
        requires javafx.swing;
        requires javafx.web;
    
        opens application to javafx.graphics;
    }
    

    2. 确保资源文件路径正确

    确保target.png文件存在于类路径中,通常放在src/main/resources目录下。修改图像路径以确保正确加载:

    ImageView targetIcon = new ImageView(new Image(getClass().getResourceAsStream("/target.png")));
    

    3. 配置JavaFX库

    在IDE中,确保JavaFX库已添加到项目库路径中。在Maven或Gradle项目中,确保已正确配置依赖项。

    示例代码

    以下是修改后的完整代码示例:

    package application;
    
    import javafx.application.Application;
    import javafx.scene.Group;
    import javafx.scene.PerspectiveCamera;
    import javafx.scene.Scene;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.StackPane;
    import javafx.scene.paint.Color;
    import javafx.scene.paint.PhongMaterial;
    import javafx.scene.shape.Box;
    import javafx.scene.transform.Rotate;
    import javafx.scene.transform.Translate;
    import javafx.stage.Stage;
    
    public class Main extends Application {
    
        private double anchorX, anchorY;
        private double anchorAngleX = 0;
        private double anchorAngleY = 0;
    
        private final Rotate rotateX = new Rotate(0, Rotate.X_AXIS);
        private final Rotate rotateY = new Rotate(0, Rotate.Y_AXIS);
        private final Translate cameraTranslate = new Translate(0, 0, -500);
    
        @Override
        public void start(Stage primaryStage) {
            Box box = new Box(100, 100, 100);
            PhongMaterial material = new PhongMaterial(Color.BLUE);
            box.setMaterial(material);
    
            PerspectiveCamera camera = new PerspectiveCamera(true);
            camera.getTransforms().addAll(cameraTranslate, rotateX, rotateY);
    
            Group root = new Group();
            root.getChildren().addAll(box, camera);
    
            Scene scene3D = new Scene(root, 800, 600);
            scene3D.setFill(Color.BLACK);
            scene3D.setCamera(camera);
    
            scene3D.setOnMousePressed(event -> {
                anchorX = event.getSceneX();
                anchorY = event.getSceneY();
                anchorAngleX = rotateX.getAngle();
                anchorAngleY = rotateY.getAngle();
            });
    
            scene3D.setOnMouseDragged(event -> {
                rotateX.setAngle(anchorAngleX - (anchorY - event.getSceneY()));
                rotateY.setAngle(anchorAngleY + (anchorX - event.getSceneX()));
            });
    
            scene3D.setOnScroll(event -> {
                double delta = event.getDeltaY();
                cameraTranslate.setZ(cameraTranslate.getZ() + delta);
            });
    
            ImageView targetIcon = new ImageView(new Image(getClass().getResourceAsStream("/target.png")));
            targetIcon.setFitWidth(40);
            targetIcon.setFitHeight(40);
    
            StackPane stackPane = new StackPane();
            stackPane.getChildren().addAll(scene3D.getRoot(), targetIcon);
    
            StackPane.setAlignment(targetIcon, javafx.geometry.Pos.CENTER);
    
            Scene scene = new Scene(stackPane, 800, 600);
    
            primaryStage.setTitle("Fixed Target Icon Example");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    总结

    通过添加模块依赖、确保资源文件路径正确以及正确配置JavaFX库,可以解决“Exception in Application start method”报错问题。用户应检查并修改上述提到的代码区域,以确保程序正确运行。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    评论

报告相同问题?

问题事件

  • 创建了问题 8月18日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?