JCEF (Java Chromium Embedded Framework) 浏览器不加载内容; Eclipse 上只有空白屏幕
JCEF (Java Chromium Embedded Framework) Browser does not load content; only blank screen on Eclipse
一段时间以来,我一直在尝试让 Chromium 嵌入式框架 (JCEF) 的 Java 版本在 Eclipse 上运行。我能够验证库文件是否正常工作,因为如果我 运行 虚拟机上包含的示例 class 文件,程序 运行s 和一些网页就会显示出来。但是,如果我从 Eclipse 运行 程序中,程序将始终显示空白 window。我能够验证库二进制文件 jcef_helper.exe
是否成功 运行,但无论我如何 link .jar 文件和其他库文件,网页都不会生成,并且始终存在是一个空白屏幕。我不能在这里查明问题。我尝试指定路径,添加我的 OS 环境变量 PATH 字段的 JCEF 库路径无济于事。我遵循了文档,当我与编译/ 运行 有任何关系时,即使是示例文件也会以相同的方式运行。值得注意的是,我的 Eclipse 控制台将在 运行:
期间显示此内容
initialize on Thread[AWT-EventQueue-0,6,main]
也许线程有问题?
有问题的代码:
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import org.cef.CefApp;
import org.cef.CefApp.CefAppState;
import org.cef.CefClient;
import org.cef.CefSettings;
import org.cef.browser.CefBrowser;
import org.cef.handler.CefAppHandlerAdapter;
public class WebV
{
public static void main(String args[])
{
Dimension dispDimension = Toolkit.getDefaultToolkit().getScreenSize();
int width = (int)Math.round(dispDimension.getWidth() / 2);
int height = (int)Math.round(dispDimension.getHeight() / 2);
CefApp.addAppHandler(new CefAppHandlerAdapter(null)
{
@Override
public void stateHasChanged(CefAppState state)
{
if(state == CefAppState.TERMINATED)
{
System.exit(0);
}
}
});
CefSettings settings = new CefSettings();
settings.windowless_rendering_enabled = false;
CefApp cefApp = CefApp.getInstance(settings);
CefClient client = cefApp.createClient();
CefBrowser browser = client.createBrowser("http://www.google.com", false, false);
Component browserComponent = browser.getUIComponent();
JFrame frame = new JFrame();
frame.setTitle("WebV");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(width, height);
frame.setResizable(true);
frame.setLocationRelativeTo(null);
frame.add(browserComponent);
frame.setVisible(true);
}
}
测试了 Java 17 和 Java 8。
运行 在 Eclipse 上,VM 参数:
-Djava.library.path=./bin/lib/win64
不胜感激。
此答案由 'Yanovsky' 在 JCEF 论坛上友情提供。
JCEF 包提供的简单示例是不完整的。
我们需要向我们的浏览器客户端添加一个 CefMessageRouter
实例。这在详细的例子中得到了证明,但不是简单的例子。此代码应添加 before 我们创建我们的 CefBrowser
实例和 after 我们已经创建了一个 CefClient
对象:
CefMessageRouter msgRouter = CefMessageRouter.create();
msgRouter.addHandler(new MessageRouterHandler(), true);
msgRouter.addHandler(new MessageRouterHandlerEx(client), false);
client.addMessageRouter(msgRouter);
作为参考,这是我在 JCEF 论坛中的 post:
https://magpcss.org/ceforum/viewtopic.php?f=17&t=18834&sid=45381db639d1621f2f8b38b4d8848800
一段时间以来,我一直在尝试让 Chromium 嵌入式框架 (JCEF) 的 Java 版本在 Eclipse 上运行。我能够验证库文件是否正常工作,因为如果我 运行 虚拟机上包含的示例 class 文件,程序 运行s 和一些网页就会显示出来。但是,如果我从 Eclipse 运行 程序中,程序将始终显示空白 window。我能够验证库二进制文件 jcef_helper.exe
是否成功 运行,但无论我如何 link .jar 文件和其他库文件,网页都不会生成,并且始终存在是一个空白屏幕。我不能在这里查明问题。我尝试指定路径,添加我的 OS 环境变量 PATH 字段的 JCEF 库路径无济于事。我遵循了文档,当我与编译/ 运行 有任何关系时,即使是示例文件也会以相同的方式运行。值得注意的是,我的 Eclipse 控制台将在 运行:
initialize on Thread[AWT-EventQueue-0,6,main]
也许线程有问题?
有问题的代码:
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import org.cef.CefApp;
import org.cef.CefApp.CefAppState;
import org.cef.CefClient;
import org.cef.CefSettings;
import org.cef.browser.CefBrowser;
import org.cef.handler.CefAppHandlerAdapter;
public class WebV
{
public static void main(String args[])
{
Dimension dispDimension = Toolkit.getDefaultToolkit().getScreenSize();
int width = (int)Math.round(dispDimension.getWidth() / 2);
int height = (int)Math.round(dispDimension.getHeight() / 2);
CefApp.addAppHandler(new CefAppHandlerAdapter(null)
{
@Override
public void stateHasChanged(CefAppState state)
{
if(state == CefAppState.TERMINATED)
{
System.exit(0);
}
}
});
CefSettings settings = new CefSettings();
settings.windowless_rendering_enabled = false;
CefApp cefApp = CefApp.getInstance(settings);
CefClient client = cefApp.createClient();
CefBrowser browser = client.createBrowser("http://www.google.com", false, false);
Component browserComponent = browser.getUIComponent();
JFrame frame = new JFrame();
frame.setTitle("WebV");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(width, height);
frame.setResizable(true);
frame.setLocationRelativeTo(null);
frame.add(browserComponent);
frame.setVisible(true);
}
}
测试了 Java 17 和 Java 8。 运行 在 Eclipse 上,VM 参数:
-Djava.library.path=./bin/lib/win64
不胜感激。
此答案由 'Yanovsky' 在 JCEF 论坛上友情提供。
JCEF 包提供的简单示例是不完整的。
我们需要向我们的浏览器客户端添加一个 CefMessageRouter
实例。这在详细的例子中得到了证明,但不是简单的例子。此代码应添加 before 我们创建我们的 CefBrowser
实例和 after 我们已经创建了一个 CefClient
对象:
CefMessageRouter msgRouter = CefMessageRouter.create();
msgRouter.addHandler(new MessageRouterHandler(), true);
msgRouter.addHandler(new MessageRouterHandlerEx(client), false);
client.addMessageRouter(msgRouter);
作为参考,这是我在 JCEF 论坛中的 post: https://magpcss.org/ceforum/viewtopic.php?f=17&t=18834&sid=45381db639d1621f2f8b38b4d8848800