- 打开github chromiumembedded/java-cef
下载java/org/cef文件夹下所有文件 - 打开 jcefbuild /jcefbuild
下载2019年release的win64.zip - 新建一个plugin工程
- 解压步骤2下载的包
将
gluegen-rt-natives-windows-amd64.jar
gluegen-rt.jar
jcef-tests.jar
jcef.jar
jogl-all-natives-windows-amd64.jar
jogl-all.jar
导入到插件中
将bin\lib\win64所有文件放到插件工程中 - 新建一个工具类
public class SystemPathUtil {
public static void addLibraryPath(String path) {
if (null != path && !"".equals(path)) {
try {
Field field = ClassLoader.class.getDeclaredField("usr_paths");
field.setAccessible(true);
String[] paths = (String[]) field.get(null);
for (int i = 0; i < paths.length; i++) {
if (path.equals(paths[i])) {
return;
}
}
String[] tmp = new String[paths.length + 1];
System.arraycopy(paths, 0, tmp, 0, paths.length);
tmp[paths.length] = path;
field.set(null, tmp);
paths = (String[]) field.get(null);
StringBuilder addPath = new StringBuilder();
int lastAddPathIndex = path.lastIndexOf(";");
if (-1 != lastAddPathIndex && (lastAddPathIndex == (path.length() - 1))) {
addPath.append(path);
} else {
addPath.append(path);
addPath.append(";");
}
StringBuilder sb = new StringBuilder();
String libPath = System.getProperty("java.library.path");
if (null == libPath || "".equals(libPath)) {
sb.append(addPath);
} else {
sb.append(libPath);
int lastIndex = sb.lastIndexOf(";");
if (-1 != lastIndex) {
sb.insert(lastIndex + 1, addPath);
} else {
sb.insert(0, addPath);
}
}
System.setProperty("java.library.path", sb.toString());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
}
- 新建一个SWT Composite
public class SWTCefBrowser extends Composite {
public static final String BROWSER_ID = "com.my.swt.cef.win64.browser";
private CefApp cefApp_;
private CefClient client_;
private CefBrowser browser_;
private JTextField address_;
private Frame frame_;
String startURL = "https://www.baidu.com";
public SWTCefBrowser(Composite parent) {
super(parent, SWT.EMBEDDED);
this.setLayout(new FillLayout());
this.setLayoutData(new GridData(GridData.FILL_BOTH));
createBrowser();
super.setDragDetect(true);
}
/**
* 设置浏览地址
* @param url
* @return
*/
public boolean setUrl(String url) {
if (browser_.isLoading()) {
browser_.stopLoad();
}
browser_.loadURL(url != null ? url : "about:blank");
return true;
}
public void executeJavaScript(String script){
browser_.executeJavaScript(script, "", 1);
}
private void createBrowser() {
CefApp.addAppHandler(new CefAppHandlerAdapter(null) {
@Override
public void stateHasChanged(org.cef.CefApp.CefAppState state) {
// Shutdown the app if the native CEF part is terminated
if (state == CefAppState.TERMINATED) System.exit(0);
}
});
CefSettings settings = new CefSettings();
settings.windowless_rendering_enabled = false;
cefApp_ = CefApp.getInstance(settings);
client_ = cefApp_.createClient();
browser_ = client_.createBrowser(startURL, false, false);
client_.addDisplayHandler(new CefDisplayHandlerAdapter() {
@Override
public void onAddressChange(CefBrowser browser, CefFrame frame, String url) {
}
});
address_ = new JTextField(startURL, 100);
address_.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
browser_.loadURL(address_.getText());
}
});
// Update the address field when the browser URL changes.
client_.addDisplayHandler(new CefDisplayHandlerAdapter() {
@Override
public void onAddressChange(CefBrowser browser, CefFrame frame, String url) {
address_.setText(url);
}
});
// Clear focus from the address field when the browser gains focus.
client_.addFocusHandler(new CefFocusHandlerAdapter() {
@Override
public void onGotFocus(CefBrowser browser) {
}
@Override
public void onTakeFocus(CefBrowser browser, boolean next) {
}
});
frame_ = SWT_AWT.new_Frame(this);
frame_.add(address_,BorderLayout.NORTH);
frame_.add(browser_.getUIComponent(), BorderLayout.CENTER);
frame_.pack();
frame_.setVisible(true);
}
@Override
public void dispose() {
frame_.dispose();
browser_.doClose();
super.dispose();
}
@Override
public boolean forceFocus() {
return super.forceFocus();
}
@Override
public boolean setFocus() {
return true;
}
@Override
public boolean isFocusControl() {
return true;
}
@Override
public Point computeSize(int wHint, int hHint) {
Point computeSize = this.computeSize(wHint, hHint, true);
return computeSize;
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
Point size = getParent().getSize();
return size;
}
public static void main(String[] args) {
String dir = "lib/win64";
SystemPathUtil.addLibraryPath(dir);
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
SWTCefBrowser browser = new SWTCefBrowser (shell);
browser.setUrl("www.baidu.com");
// browser.setUrl("file:///C:/Users/guoenjing/Desktop/note/add_series.html");
shell.open();
while(!shell.isDisposed()) {
if(!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
详见https://github.com/Abbreviation-g/com.my.swt.cef.win64