You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaFX火箭程序中添加可关闭程序的退出按钮?

解决JavaFX火箭程序同时显示火箭与退出按钮的问题

问题分析

你的Rocket1.java存在两个核心问题:

  • Scene构造方法错误:JavaFX的Scene只能接收一个根节点,你写的new Scene(root, exitButton, 400, 400, Color.BLACK)是无效语法,导致程序无法同时渲染火箭和按钮,只能显示其一或报错。
  • 冗余代码提示:按钮事件处理的lambda表达式里(ActionEvent event)属于冗余声明,编译器可自动推断参数类型,这就是你看到“程序可简化”报错的原因。

修正后的完整代码

以下代码使用BorderPane作为顶层布局容器,将火箭图形放在中心区域,退出按钮放在底部,实现两者同时显示且按钮功能正常:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Polyline;
import javafx.stage.Stage;

public class Rocket1 extends Application {
    public void start(Stage primaryStage) {
        // 火箭图形绘制代码
        double[] hullPoints = {200, 25, 240, 60, 240, 230, 270, 260, 
                 270, 300, 140, 300, 140, 260, 160, 230, 160, 60};
        Polygon rocket = new Polygon(hullPoints);
        rocket.setFill(Color.BEIGE);
        
        double[] hatchPoints = {185, 70, 215, 70, 220, 120, 180, 120};
        Polygon hatch = new Polygon(hatchPoints);
        hatch.setFill(Color.MAROON);
        
        double[] flamePoints = {142, 310, 142, 330, 150, 325, 155, 380, 
                 165, 340, 175, 360, 190, 350, 200, 375, 215, 330, 220, 360, 
                 225, 355, 230, 370, 240, 340, 255, 370, 260, 335, 268, 340, 
                 268, 310};
        Polyline flame = new Polyline(flamePoints);
        flame.setStroke(Color.RED);
        flame.setStrokeWidth(3);

        Group rocketGroup = new Group(rocket, hatch, flame);
        
        // 退出按钮设置
        Button quitBtn = new Button("Quit");
        quitBtn.setOnAction(e -> Platform.exit()); // 简化lambda表达式

        HBox buttonBox = new HBox(quitBtn);
        buttonBox.setPadding(new Insets(25));
        
        // 用BorderPane作为根容器,分别放置火箭和按钮
        BorderPane root = new BorderPane();
        root.setCenter(rocketGroup);
        root.setBottom(buttonBox);
        root.setStyle("-fx-background-color: black;"); // 设置黑色背景

        // 正确构造Scene,仅传入一个根节点
        Scene scene = new Scene(root, 400, 450); // 调高高度避免按钮遮挡火箭火焰
        primaryStage.setTitle("Rocket with Quit Button");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

关键修改说明

  1. 布局容器替换:用BorderPane替代原有的Group作为顶层根节点,它支持分区布局,能同时放置图形和控件而不重叠。
  2. 组件分区放置:火箭图形组放在BorderPane的中心区域,按钮容器放在底部区域,确保两者都能正常显示。
  3. 代码简化:去掉按钮事件处理中冗余的ActionEvent声明,解决“程序可简化”的报错提示。
  4. 界面适配:微调Scene高度,避免底部按钮遮挡火箭火焰;给BorderPane设置黑色背景,保持原程序的视觉风格。

内容的提问来源于stack exchange,提问作者Sayori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:24:59