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

Java JxBrowser-如何在多个组件中获得相同的浏览器会话,java,swing,jxbrowser,Java,Swing,Jxbrowser,我已经成功地将JxBrowser集成到Java Swing应用程序中。其中一个视图(BrowserView)位于JTabbedPane+JPanel中。我想让用户在一个单独的JFrame中切换到全屏。请注意,在我们的项目中,只有一个JFrame是非常困难的 对于第二个视图,如何恢复已打开的会话? 相反,当返回到集成视图时,如何恢复全屏会话。 或者,换句话说,我怎样才能拥有一个包含两个视图的浏览会话? 我试图重新获取浏览器实例和/或BrowserView实例,但没有成功。我得到的最好结果是在JFr

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

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

我试图重新获取浏览器实例和/或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”实例崩溃。

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

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


我找到了一个解决办法。嗯,不仅仅是。。。JxBrowser支持部门正在监控StackOverflow上的帖子,并向我发送了一封私人电子邮件,向我提供解决方案:与我的想法相反,完全可以将Swing组件从一个容器移动到另一个容器——甚至可以将一个像BrowserView一样大的组件。 因此,我只是实例化一个浏览器和一个BrowserView,并将BrowserView实例从JTabbedPane+JPanel移动到JFrame:

  • JTabbedPane/JPanel.remove()
  • JFrame/JPanel.add()
  • (反之,当JFrame关闭时)
在我的例子中,它工作得很好,因为JFrame的大小和位置是受控的,并且总是与JTabbedPane重叠:当JFrame显示时,没有人能在JTabbedPane中看到“dead”BrowserView。但是,如果您遵循我的示例,则应该警告您,由于只创建了一个BrowserView,因此一次只有一个BrowserView处于活动状态


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

似乎是一个很好的解决方案(我在google上尝试了几次搜索,但什么也没找到)。我将很快检查此解决方案。谢谢您的回答。虽然它没有回答我的问题,但您的回答告诉我,我必须处理多个“引擎”实例的userDataDir选项。我目前使用的是JxBrowser v7,所以初始化代码是:
Engine Engine=Engine.newInstance(EngineOptions.newBuilder(…).userDataDir(path.get(“/Users/Me/.JxBrowser”)).build()我必须指定我不是试图在两个浏览器之间共享文件(缓存、cookies等),而是为了获得完全相同的浏览会话的两个视图(在两个BrowserView Swing组件中)。不确定这是否可能。
BrowserContext context = new BrowserContext(
    new BrowserContextParams("C:\\my-data1"));
Browser browser1 = new Browser(context);
Browser browser2 = new Browser(context);