|
|
|
@ -0,0 +1,203 @@
|
|
|
|
|
package com.example.jcef;
|
|
|
|
|
|
|
|
|
|
import com.melloware.jintellitype.HotkeyListener;
|
|
|
|
|
import com.melloware.jintellitype.JIntellitype;
|
|
|
|
|
import me.friwi.jcefmaven.CefAppBuilder;
|
|
|
|
|
import me.friwi.jcefmaven.CefBuildInfo;
|
|
|
|
|
import me.friwi.jcefmaven.CefInitializationException;
|
|
|
|
|
import me.friwi.jcefmaven.MavenCefAppHandlerAdapter;
|
|
|
|
|
import me.friwi.jcefmaven.UnsupportedPlatformException;
|
|
|
|
|
import org.cef.CefApp;
|
|
|
|
|
import org.cef.CefClient;
|
|
|
|
|
import org.cef.browser.CefBrowser;
|
|
|
|
|
|
|
|
|
|
import javax.swing.*;
|
|
|
|
|
import java.awt.*;
|
|
|
|
|
import java.awt.event.FocusListener;
|
|
|
|
|
import java.awt.event.KeyListener;
|
|
|
|
|
import java.awt.event.MouseListener;
|
|
|
|
|
import java.awt.event.WindowAdapter;
|
|
|
|
|
import java.awt.event.WindowEvent;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
|
|
|
|
|
public class WebClient extends JFrame {
|
|
|
|
|
|
|
|
|
|
// 退出
|
|
|
|
|
private final int KEY_MARK_ESC = 1;
|
|
|
|
|
// 最小化
|
|
|
|
|
private final int KEY_MARK_SWITCH = 2;
|
|
|
|
|
// 刷新
|
|
|
|
|
private final int KEY_MARK_RELOAD = 3;
|
|
|
|
|
// 强制刷新
|
|
|
|
|
private final int KEY_MARK_RELOAD_FORCE = 4;
|
|
|
|
|
|
|
|
|
|
private CefClient cefClient;
|
|
|
|
|
private CefBrowser cefBrowser;
|
|
|
|
|
|
|
|
|
|
private final HotkeyListener hotkeyListener = new HotkeyListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onHotKey(int i) {
|
|
|
|
|
switch (i) {
|
|
|
|
|
case KEY_MARK_ESC: {
|
|
|
|
|
System.out.println("log: esc");
|
|
|
|
|
JIntellitype.getInstance().unregisterHotKey(KEY_MARK_ESC);
|
|
|
|
|
JIntellitype.getInstance().removeHotKeyListener(hotkeyListener);
|
|
|
|
|
close();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case KEY_MARK_SWITCH: {
|
|
|
|
|
System.out.println("log: switch");
|
|
|
|
|
if (getExtendedState() == Frame.NORMAL) {
|
|
|
|
|
removeNotify();
|
|
|
|
|
setUndecorated(true);
|
|
|
|
|
setExtendedState(JFrame.MAXIMIZED_BOTH);
|
|
|
|
|
} else {
|
|
|
|
|
setExtendedState(Frame.NORMAL);
|
|
|
|
|
removeNotify();
|
|
|
|
|
setUndecorated(false);
|
|
|
|
|
}
|
|
|
|
|
setVisible(true);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case KEY_MARK_RELOAD: {
|
|
|
|
|
System.out.println("log: reload");
|
|
|
|
|
reload();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case KEY_MARK_RELOAD_FORCE: {
|
|
|
|
|
System.out.println("log: reloadForce");
|
|
|
|
|
reloadForce();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public WebClient() throws HeadlessException, InterruptedException, UnsupportedPlatformException, CefInitializationException, IOException {
|
|
|
|
|
super();
|
|
|
|
|
initCef(new String[]{});
|
|
|
|
|
initClient(new String[]{});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void initClient(String[] args) {
|
|
|
|
|
setTitle("WebClient");
|
|
|
|
|
getContentPane().add(cefBrowser.getUIComponent(), BorderLayout.CENTER);
|
|
|
|
|
setSize(800, 600);//初始大小
|
|
|
|
|
setLocation(0, 0);//位置
|
|
|
|
|
// 设置为全屏模式
|
|
|
|
|
setExtendedState(JFrame.MAXIMIZED_BOTH);
|
|
|
|
|
setUndecorated(true);
|
|
|
|
|
setAlwaysOnTop(true);
|
|
|
|
|
addWindowListener(new WindowAdapter() {
|
|
|
|
|
@Override
|
|
|
|
|
public void windowClosing(WindowEvent e) {
|
|
|
|
|
// 关闭应用时要释放资源
|
|
|
|
|
CefApp.getInstance().dispose();
|
|
|
|
|
dispose();
|
|
|
|
|
System.exit(0);//0正常退出,1非正常退出
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 添加热键
|
|
|
|
|
JIntellitype.getInstance().registerHotKey(KEY_MARK_ESC, 0, KeyEnum.ESC.value());
|
|
|
|
|
JIntellitype.getInstance().registerHotKey(KEY_MARK_SWITCH, 0, KeyEnum.F11.value());
|
|
|
|
|
JIntellitype.getInstance().registerHotKey(KEY_MARK_RELOAD, 0, KeyEnum.F5.value());
|
|
|
|
|
JIntellitype.getInstance().registerHotKey(KEY_MARK_RELOAD_FORCE, KeyEnum.MOD_CONTROL.value(), KeyEnum.F5.value());
|
|
|
|
|
JIntellitype.getInstance().addHotKeyListener(hotkeyListener);
|
|
|
|
|
|
|
|
|
|
// 显示
|
|
|
|
|
setVisible(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 初始化 CefBrowser
|
|
|
|
|
*
|
|
|
|
|
* @param args
|
|
|
|
|
*/
|
|
|
|
|
private void initCef(String[] args) throws InterruptedException, UnsupportedPlatformException, CefInitializationException, IOException {
|
|
|
|
|
CefAppBuilder builder = new CefAppBuilder();
|
|
|
|
|
// window下不需要OSR
|
|
|
|
|
boolean useOSR = false;
|
|
|
|
|
builder.getCefSettings().windowless_rendering_enabled = useOSR;
|
|
|
|
|
builder.setAppHandler(new MavenCefAppHandlerAdapter() {
|
|
|
|
|
@Override
|
|
|
|
|
public void stateHasChanged(org.cef.CefApp.CefAppState state) {
|
|
|
|
|
// 关闭应用时退出jvm运行
|
|
|
|
|
if (state == CefApp.CefAppState.TERMINATED) System.exit(0);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 设置cef运行参数,这里为空
|
|
|
|
|
builder.addJcefArgs(args);
|
|
|
|
|
|
|
|
|
|
// 这边不设置,程序会自动解压
|
|
|
|
|
// 设置 cef chrome实例的目录,关键,若不设置他会默认从网络中下载,国外网络可能下载不稳定导致失败
|
|
|
|
|
// 我的 cef chrome 位于项目的chrome目录下 C:\Users\Administrator\Desktop\project\java\demo-desktop\chrome
|
|
|
|
|
// builder.setInstallDir(new File(System.getProperty("user.dir") + File.separator + "chrome"));
|
|
|
|
|
// 由于是手动设置cef的chrome,我们要跳过ins检查,防止版本不一致导致从镜像站下载
|
|
|
|
|
// builder.setSkipInstallation(true);
|
|
|
|
|
|
|
|
|
|
// 全局的 CefApp 每个程序只能有一个,线程安全
|
|
|
|
|
CefApp build = builder.build();
|
|
|
|
|
// 显示一些版本信息
|
|
|
|
|
CefBuildInfo buildInfo = CefBuildInfo.fromClasspath();
|
|
|
|
|
System.out.println(buildInfo);
|
|
|
|
|
CefApp.CefVersion cefVersion = build.getVersion();
|
|
|
|
|
System.out.println(cefVersion);
|
|
|
|
|
|
|
|
|
|
// 创建一个浏览器客户端实例
|
|
|
|
|
cefClient = build.createClient();
|
|
|
|
|
|
|
|
|
|
// 创建一个浏览器实例,设置访问 url https://www.baidu.com
|
|
|
|
|
cefBrowser = cefClient.createBrowser("about:blank", useOSR, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 加载地址
|
|
|
|
|
*
|
|
|
|
|
* @param url 地址
|
|
|
|
|
* @throws InterruptedException
|
|
|
|
|
*/
|
|
|
|
|
public void loadUrl(String url) throws InterruptedException {
|
|
|
|
|
// 必须延迟,否则可能因为切换太快无法加载成功
|
|
|
|
|
Thread.sleep(300);
|
|
|
|
|
cefBrowser.loadURL(url);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 刷新
|
|
|
|
|
*/
|
|
|
|
|
public void reload() {
|
|
|
|
|
cefBrowser.reload();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 强制刷新
|
|
|
|
|
*/
|
|
|
|
|
public void reloadForce() {
|
|
|
|
|
cefBrowser.reloadIgnoreCache();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void addFocusListener(FocusListener listener) {
|
|
|
|
|
cefBrowser.getUIComponent().addFocusListener(listener);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void addMouseListener(MouseListener listener) {
|
|
|
|
|
cefBrowser.getUIComponent().addMouseListener(listener);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void addKeyListener(KeyListener listener) {
|
|
|
|
|
cefBrowser.getUIComponent().addKeyListener(listener);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void executeJavaScript(String javascript) {
|
|
|
|
|
cefBrowser.executeJavaScript(javascript, null, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void close() {
|
|
|
|
|
// 关闭应用时要释放资源
|
|
|
|
|
CefApp.getInstance().dispose();
|
|
|
|
|
dispose();
|
|
|
|
|
System.exit(0);
|
|
|
|
|
}
|
|
|
|
|
}
|