为什么我的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);
}
}