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

BorderPane布局开发报错求助:InvocationTargetException异常排查

问题分析与解决方案

嘿,我帮你找到了导致程序崩溃的核心问题,马上给你梳理清楚并提供修复后的代码!

错误原因拆解

  • 重复添加组件到父容器:你已经通过BorderPane的setTop(hb1)、setCenter(gp)、setBottom(hb2)方法,将三个容器正确添加到了布局的对应区域,但后续又调用了bp.getChildren().addAll(hb1,hb2,gp)——这相当于把同一个组件重复加入到BorderPane中,JavaFX不允许一个节点同时属于多个父容器,这就是触发Exception in Application start method的直接原因。
  • GridPane重复添加Label:你先通过gp.add()逐个添加了lb4-lb7,之后又调用gp.getChildren().addAll(lb4,lb5,lb6,lb7),同样属于重复添加,会导致GridPane里的Label重复显示。

修正后的完整代码

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Border;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.BorderStroke;
import javafx.scene.layout.BorderStrokeStyle;
import javafx.scene.layout.BorderWidths;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import java.nio.file.Paths;

public class LabelBorder extends Application {

    @Override
    public void start(Stage primaryStage) {
        BorderPane bp = new BorderPane();
        bp.setPrefSize(400, 400);

        // 顶部HBox区域
        HBox hb1 = new HBox();
        Label lb1 = new Label("");
        lb1.setPrefWidth(200);
        lb1.setBorder(new Border(new BorderStroke(Color.AQUAMARINE, BorderStrokeStyle.SOLID, null, new BorderWidths(5))));
        Label lb2 = new Label("");
        lb2.setPrefWidth(200);
        lb2.setBorder(new Border(new BorderStroke(Color.BLUEVIOLET, BorderStrokeStyle.SOLID, null, new BorderWidths(5))));
        hb1.getChildren().addAll(lb1, lb2);

        // 底部HBox(图片Label)
        HBox hb2 = new HBox();
        Label lb3 = new Label();
        // 优化图片加载逻辑,添加异常处理避免路径错误导致崩溃
        try {
            Image image = new Image(Paths.get("D:\\Barca.jpg").toUri().toString());
            lb3.setGraphic(new ImageView(image));
            lb3.autosize();
        } catch (Exception e) {
            lb3.setText("图片加载失败");
            e.printStackTrace();
        }
        hb2.getChildren().addAll(lb3);

        // 中间GridPane区域
        GridPane gp = new GridPane();
        Label lb4 = new Label("");
        Label lb5 = new Label("");
        Label lb6 = new Label("");
        Label lb7 = new Label("");
        // 只需要用add方法添加一次即可,避免重复添加
        gp.add(lb4, 0, 0);
        gp.add(lb5, 0, 1);
        gp.add(lb6, 1, 0);
        gp.add(lb7, 1, 1);

        // 可选:给GridPane的Label添加边框,方便直观看到布局位置
        Border gridBorder = new Border(new BorderStroke(Color.GRAY, BorderStrokeStyle.DASHED, null, new BorderWidths(2)));
        lb4.setBorder(gridBorder);
        lb5.setBorder(gridBorder);
        lb6.setBorder(gridBorder);
        lb7.setBorder(gridBorder);

        // 给BorderPane设置各区域,无需再调用getChildren().addAll
        bp.setTop(hb1);
        bp.setCenter(gp);
        bp.setBottom(hb2);

        Scene scene = new Scene(bp);
        primaryStage.setTitle("BorderPane布局示例");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

额外优化说明

  • 给GridPane的Label添加了虚线边框,方便你直观看到每个Label的布局位置(可根据需求移除)。
  • 给图片加载添加了异常捕获,避免因为图片路径错误或文件不存在导致程序直接崩溃。
  • 给Stage设置了标题,提升界面友好度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:59:09