如何在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
相关产品推荐
相关产品推荐

