关闭阶段JavaFX后如何停止WebEngine?

Posted

技术标签:

【中文标题】关闭阶段JavaFX后如何停止WebEngine?【英文标题】:How to stop WebEngine after closing stage JavaFX? 【发布时间】:2014-04-21 14:29:08 【问题描述】:

当我使用 WebEngine 创建新阶段以播放来自 YouTube 的视频时,在我关闭它后 - Youtube 继续在背景上播放。如果我使用“Platform.exit” - 它会关闭我所有的 JavaFX 应用程序,但我只想关闭为 YouTube 创建的阶段。

这是我的 YouTube 播放器课程:

public class YouTube_player  
    public YouTube_player(String url) 
        final Group root = new Group();
        Scene scene = new Scene(root, 820, 480);

        final Stage stage = new Stage();
        final WebView webView = new WebView();
        final WebEngine webEngine = webView.getEngine();
        webEngine.loadContent(url);
        root.getChildren().add(webView);
        stage.centerOnScreen();

        stage.setScene(scene);
        stage.show();
        stage.setOnCloseRequest(new EventHandler<WindowEvent>()

            @Override
            public void handle(WindowEvent event) 
              //What i should put here to close only this stage.
              //Platform.exit - closes all my stages.
              //webEngine.getLoadWorker().cancel(); - dont stop Youtube )))
            
        );

    

点击“主舞台”中的按钮后,我的 Youtube 播放器舞台正在创建:

b1.setOnAction(new EventHandler<ActionEvent>() 
    @Override public void handle(ActionEvent event) 
        new YouTube_player(url_video_p1);
    
);

【问题讨论】:

【参考方案1】:

Java 9,对我来说有效:

webView.getEngine().load("");

【讨论】:

【参考方案2】:

你不能dispose webengine,你唯一能做的就是将webEngine的内容设置为null

webView.getEngine().load(null);

【讨论】:

如果 WebEngine 卡在 JS 循环中,这将不起作用。有没有办法阻止 ScriptEngine 运行? @Frederic Leitenberger 您是否尝试使用事件处理程序或 CountdownLatch 来终止循环。 Platform.exit() 怎么样? Platform.exit() 不起作用,因为它将关闭整个子系统。因此,当您仍想在其他窗口/视图中使用它时,您不能这样做。如果不重新启动 JVM,就无法从 Platform.exit() 恢复。 @AndrewScottEvans 我不知道CountdownLatch 如何停止 JS 脚本(这是 VM 代码)。关于“杀死循环” - 也不知道如何......我知道的唯一方法是中断或杀死线程,但这也可能是不可能的,或者会导致其他不良副作用。 有一件事(我前一阵子注意到)与此有关:似乎任何 JS 脚本在 10 秒后都会静默停止(无论如何)。但在这里也没有多大用处。尝试显示新内容时“等待 10 秒”听起来不合理。而且它默默地停止脚本的事实也是不合理的。它至少应该记录一些东西和/或有一个设置来控制它。

以上是关于关闭阶段JavaFX后如何停止WebEngine?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一定时间后关闭一个阶段JavaFX

JavaFX 8 WebEngine:如何从 javascript 获取 console.log() 到 java 中的 System.out?

附加文本WebEngine - JavaFX

JavaFX WebEngine上的UserAgent实现方法

如何在 JavaFX 中获得一个阶段的关闭事件?

尝试将本地页面加载到 JavaFX webEngine