JxBrowser - 如何在多个组件中获取相同的浏览器会话

问题描述

我已成功将 JxBrowser 集成到 Java Swing 应用程序中。其中一个视图 (BrowserView) 位于 JTabbedPane + JPanel 内。我想让用户选择在单独的 JFrame 中切换到全屏。 请注意,在我们的项目中只有一个 JFrame 会非常困难

对于第二个视图,如何恢复已经打开的会话? 相反,如何在返回集成视图时恢复全屏会话。 或者,换句话说,我怎样才能有两个视图的单个浏览会话?

我尝试重新获取 Browser 实例和/或 BrowserView 实例,但无济于事。我得到的最好的方法是在 JFrame 中使用相同的 2 个实例。上下文被接管,但集成浏览器崩溃。

这是我的源代码的摘录:

package testFiles;

import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.engine.EngineOptions;
import com.teamdev.jxbrowser.engine.RenderingMode;
import com.teamdev.jxbrowser.view.swing.BrowserView;

import javax.swing.*;
import java.awt.*;
import java.nio.file.Paths;

public class PanelChromium extends JPanel
{
    private static final String LICENCE_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    
    private static Engine engine;
    
    private final Browser     browser;
    private final BrowserView browserView;
    
    
    public static void init()
    {
        String userDataDir = System.getProperty("user.home") + "\\ChromiumData";
        EngineOptions options = EngineOptions.newBuilder(RenderingMode.OFF_SCREEN).
            licenseKey(LICENCE_KEY).diskCacheSize(100_000_000).userDataDir(Paths.get(userDataDir)).build();
        
        engine = Engine.newInstance(options);
    }
    
    /** Integrated browser */
    public PanelChromium()
    {
        this(null);
    }
    
    /**
     * Second browser in separated JFrame
     * @param org First browser instance
     */
    public PanelChromium(PanelChromium org)
    {
        setLayout(new BorderLayout(0,0));
        
        browser = (org == null) ? engine.newBrowser() : org.browser;
        browserView = (org == null) ? BrowserView.newInstance(browser) : org.browserView;
        
        add(browserView,BorderLayout.CENTER);
    }
}

我可以实例化许多“new PanelChromium()”,但“new PanelChromium(panelOne)”会使“panelOne”实例崩溃。

解决方法

我找到了解决办法。嗯,并不孤单... JxBrowser 支持人员正在监控 StackOverflow 上的帖子,并给我发了一封私人电子邮件给我解决方案:与我的想法相反,完全有可能将 Swing 组件从一个容器移动到另一个容器 - 即使是像 BrowserView 一样大的组件。 所以我只是实例化一个 Browser 和一个 BrowserView 并将 BrowserView 实例从 JTabbedPane + JPanel 移动到 JFrame:

  • JTabbedPane / JPanel.remove()
  • JFrame / JPanel.add()
  • (相反,当 JFrame 关闭时)

就我而言,它运行良好,因为 JFrame 大小和位置受到控制并且始终与 JTabbedPane 重叠:当显示 JFrame 时,没有人可以在 JTabbedPane 中看到“死”的 BrowserView。但是如果你按照我的例子,你应该被警告,因为只创建了一个 BrowserView,一次只有一个处于活动状态。

最后,我要感谢 TeamDevs 对 JxBrowser 及其快速高效的支持。

,

在谷歌上搜索一下,您似乎可以让 2 个浏览器共享一个会话:

具有相同 BrowserContext 实例的两个 Browser 实例将使用 相同的用户数据目录。因此,他们将共享 cookie 和 缓存文件。例如:Java

BrowserContext context = new BrowserContext(
    new BrowserContextParams("C:\\my-data1"));
Browser browser1 = new Browser(context);
Browser browser2 = new Browser(context);

https://jxbrowser.support.teamdev.com/support/solutions/articles/9000012878-creating-browser

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...