Java JxBrowser-如何在多个组件中获得相同的浏览器会话
我已经成功地将JxBrowser集成到Java Swing应用程序中。其中一个视图(BrowserView)位于JTabbedPane+JPanel中。我想让用户在一个单独的JFrame中切换到全屏。请注意,在我们的项目中,只有一个JFrame是非常困难的 对于第二个视图,如何恢复已打开的会话? 相反,当返回到集成视图时,如何恢复全屏会话。 或者,换句话说,我怎样才能拥有一个包含两个视图的浏览会话? 我试图重新获取浏览器实例和/或BrowserView实例,但没有成功。我得到的最好结果是在JFrame中使用相同的2个实例。上下文被接管,但集成浏览器崩溃 以下是我的源代码摘录:Java JxBrowser-如何在多个组件中获得相同的浏览器会话,java,swing,jxbrowser,Java,Swing,Jxbrowser,我已经成功地将JxBrowser集成到Java Swing应用程序中。其中一个视图(BrowserView)位于JTabbedPane+JPanel中。我想让用户在一个单独的JFrame中切换到全屏。请注意,在我们的项目中,只有一个JFrame是非常困难的 对于第二个视图,如何恢复已打开的会话? 相反,当返回到集成视图时,如何恢复全屏会话。 或者,换句话说,我怎样才能拥有一个包含两个视图的浏览会话? 我试图重新获取浏览器实例和/或BrowserView实例,但没有成功。我得到的最好结果是在JFr
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关闭时)
最后,我要感谢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);