问题描述
我已成功将 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