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

如何在JFXPanel关闭时触发操作?Swing集成JavaFX开发求助

解决方案与代码优化

获取窗口关闭时的WebView当前URL

由于你使用的是Swing的JFrame,可以通过给JFrame添加窗口关闭监听器来实现需求,具体步骤:

  • 将WebEngine的引用提升到可被监听器访问的范围(比如类静态成员)
  • 给JFrame添加WindowListener,在windowClosing方法中获取当前URL

代码优化与修改示例

调整后的完整代码

private static WebEngine authWebEngine; // 提升为类静态成员,方便监听器访问

private static void buildAuthBrowser() {
    JFrame frame = new JFrame("用户认证");
    final JFXPanel fxPanel = new JFXPanel();
    frame.add(fxPanel);
    frame.setSize(800, 600);
    frame.setLocationRelativeTo(null);
    
    // 添加窗口关闭监听器
    frame.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            // 确保在JavaFX线程中操作WebEngine
            Platform.runLater(() -> {
                String currentUrl = authWebEngine.getLocation();
                // 此处处理获取到的URL,比如提取认证参数
                System.out.println("当前认证URL:" + currentUrl);
            });
            frame.dispose();
            System.exit(0);
        }
    });
    
    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // 改为手动处理关闭逻辑
    frame.setVisible(true);

    Platform.runLater(() -> initFX(fxPanel));
}

private static void initFX(JFXPanel fxPanel) {
    Scene scene = createScene();
    fxPanel.setScene(scene);
}

private static Scene createScene() {
    Group root = new Group();
    Scene scene = new Scene(root);
    WebView view = new WebView();
    authWebEngine = view.getEngine(); // 赋值给类成员变量
    authWebEngine.load(auth.getUrl());
    
    // 可选:实时监听URL跳转,提前处理认证成功逻辑
    authWebEngine.locationProperty().addListener((obs, oldUrl, newUrl) -> {
        System.out.println("跳转至:" + newUrl);
        // 可根据实际认证成功URL的特征判断,提前关闭窗口并处理
        if (newUrl.contains("认证成功标识")) {
            SwingUtilities.invokeLater(() -> {
                Window win = SwingUtilities.getWindowAncestor(fxPanel);
                if (win != null) {
                    win.dispose();
                }
            });
        }
    });
    
    root.getChildren().add(view);
    return scene;
}

代码规范改进点

  • 窗口关闭逻辑:原代码直接使用EXIT_ON_CLOSE,改为DO_NOTHING_ON_CLOSE后手动处理,避免未获取URL就直接退出程序
  • 简化代码写法:将匿名内部类形式的Runnable替换为Lambda表达式,代码更简洁
  • 变量作用域优化:把WebEngine提升为类静态成员,避免闭包捕获带来的引用问题
  • 线程安全保障:操作JavaFX组件必须在JavaFX线程中执行,因此在windowClosing方法中用Platform.runLater包裹URL获取逻辑
  • 提前处理逻辑:添加locationProperty监听器,可实时跟踪URL跳转,一旦检测到认证成功的URL就提前处理,无需等待用户手动关闭窗口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:45:14