JCEF-鼠标右键菜单
为鼠标添加自定义菜单,比较简单,实现一个Handler就行
Hanler实现类
public class MenuHandler extends CefContextMenuHandlerAdapter{
private final static int MENU_ID_INJECTION=10000;
private final static int MENU_ID_ADDTEXT=10001;
@Override
public void onBeforeContextMenu(CefBrowser browser, CefFrame frame, CefContextMenuParams params, CefMenuModel model) {
//清除菜单项
model.clear();
//剪切、复制、粘贴
model.addItem(MenuId.MENU_ID_COPY, "复制");
model.addItem(MenuId.MENU_ID_CUT, "剪切");
model.addItem(MenuId.MENU_ID_PASTE, "粘贴");
model.addSeparator();
model.addItem(MenuId.MENU_ID_BACK, "返回");
model.setEnabled(MenuId.MENU_ID_BACK, browser.canGoBack());
model.addItem(MenuId.MENU_ID_FORWARD, "前进");
model.setEnabled(MenuId.MENU_ID_FORWARD, browser.canGoForward());
model.addItem(MenuId.MENU_ID_RELOAD, "刷新");
model.addSeparator();
//创建子菜单
CefMenuModel cmodel=model.addSubMenu(MENU_ID_INJECTION, "脚本注入");
cmodel.addItem(MENU_ID_ADDTEXT, "添加一段文本");
}
/*
* @see org.cef.handler.CefContextMenuHandler#onContextMenuCommand(org.cef.browser.CefBrowser, org.cef.browser.CefFrame, org.cef.callback.CefContextMenuParams, int, int)
*/
@Override
public boolean onContextMenuCommand(CefBrowser browser, CefFrame frame, CefContextMenuParams params, int commandId, int eventFlags) {
switch(commandId) {
case MenuId.MENU_ID_RELOAD:
browser.reload();
return true;
case MENU_ID_ADDTEXT:
browser.executeJavaScript("document.body.innerHTML+='
添加一段文本
';", browser.getURL(), 0);
return true;
}
return false;
}
}
测试类,在cefClient中添加此Handler:cefClient.addContextMenuHandler(new MenuHandler());
public class MouseMenuTestFrame extends JFrame{
/**
*
*/
private static final long serialVersionUID = 5944953587408136931L;
public static void main(String[] args) {
String url=System.getProperty("user.dir")+"/jstest.html";
new MouseMenuTestFrame(url);
}
public MouseMenuTestFrame(String url) {
//是否Linux系统
boolean useOSR=OS.isLinux();
//是否透明
boolean isTransparent=false;
//添加Handler,在CEFAPP状态为终止时退出程序
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 = useOSR;
//获取CefApp实例
CefApp cefApp=CefApp.getInstance(settings);
//创建客户端实例
CefClient cefClient = cefApp.createClient();
//添加鼠标右键菜单handler
cefClient.addContextMenuHandler(new MenuHandler());
//添加一个JS交互
jsActive(cefClient);
//创建浏览器实例
CefBrowser cefBrowser = cefClient.createBrowser(url, useOSR, isTransparent);
//将浏览器UI添加到窗口中
getContentPane().add(cefBrowser.getUIComponent(), BorderLayout.CENTER);
pack();无锡人流多少钱 http://www.bhnnk120.com/
setTitle("测试JCEF-鼠标右键事件");
setSize(800, 600);
setVisible(true);
//添加一个窗口关闭监听事件
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
CefApp.getInstance().dispose();
dispose();
}
});
}
/**
* 添加js交互
* @author:liuming
*/
public void jsActive(CefClient client) {
//配置一个查询路由,html页面可使用 window.java({}) 和 window.javaCancel({}) 来调用此方法
CefMessageRouterConfig cmrc=new CefMessageRouterConfig("java","javaCancel");
//创建查询路由
CefMessageRouter cmr=CefMessageRouter.create(cmrc);
cmr.addHandler(new CefMessageRouterHandler() {
@Override
public void setNativeRef(String str, long val) {
System.out.println(str+" "+val);
}
@Override
public long getNativeRef(String str) {
System.out.println(str);
return 0;
}
@Override
public void onQueryCanceled(CefBrowser browser, CefFrame frame, long query_id) {
System.out.println("取消查询:"+query_id);
}
@Override
public boolean onQuery(CefBrowser browser, CefFrame frame, long query_id, String request, boolean persistent,
CefQueryCallback callback) {
System.out.println("request:"+request+"\nquery_id:"+query_id+"\npersistent:"+persistent);
callback.success("Java后台处理了数据");
return true;
}
}, true);
client.addMessageRouter(cmr);
}
}
JCEF-鼠标右键菜单的更多相关文章
- jQuery自定义Web页面鼠标右键菜单
jQuery自定义Web页面鼠标右键菜单 右键菜单是固定的,很多时候,我们需要自定义web页面自定义菜单,指定相应的功能. 自定义的原理是:jQuery封装了鼠标右键的点击事件(“contextmen ...
- Qt creator 创建鼠标右键菜单 (不新建类)
界面 步骤 打开你的界面文件并选中你要添加右键的控件,选择“CustomContextMenu” 右键选择“转到槽...” -> customContextMenuRequested 插入下面代 ...
- 如何在C#添加鼠标右键菜单
C#添加鼠标右键方法步骤: 1 选中要添加右键功能的Form或者控件,打开控件的设计页面. 2 从工具箱中找到ContextMenuStrip控件,将这个控件拖曳到Form或者控件的设计页面上.这时系 ...
- 将EmEditor加入到鼠标右键菜单
在清理系统的时候,无意中将EmEditor的鼠标右键功能给清理掉了,在EmEditor的配置中又没有找到如何加入到鼠标右键菜单的方法,只好使用导入注册表功能了,以下的代码,拷贝到记事本中,保存为EmE ...
- JAVA GUI学习 - JPopupMenu鼠标右键菜单组件学习
public class JPopmenuKnow { public void test() { //为表格添加鼠标右键菜单 JMenuItem jMenuItemFileInfo = new JMe ...
- WinForm -- 为TextBox文本框添加鼠标右键菜单
WinForm -- 为TextBox文本框添加鼠标右键菜单 1. 新建一个WinForm项目,放置一个TextBox控件 2. 从工具箱拖进来一个ContextMenuStrip 3. 将TextB ...
- Qt532.【转】Qt创建鼠标右键菜单
ZC:可以通过 设置 (QWebView*)->setContextMenuPolicy(NoContextMenu); 来关闭 QWebView的默认右键菜单 Qt创建鼠标右键菜单_疯华正茂 ...
- Jquery如何禁止鼠标右键菜单
jquery中使用contextmenu事件,如果返回true,则允许右键菜单:如果返回false,则禁止右键菜单 导入文件 <script type="text/javascript ...
- 将Sublime Text 添加到鼠标右键菜单的教程方法
安装notepad++软件,在菜单右键自动会添加“edit with notepad++"的选项,那么怎么将Sublime Text 添加到鼠标右键菜单呢?下面是我的操作过程,希望有帮助! ...
- js自定义鼠标右键菜单
document.oncontextmenu = function(e) { return false; } document.onmousedown = function(e) { switch(e ...
随机推荐
- 完美解决该死的ie6下select总是置于最上层bug
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 补充:垃圾回收机制、线程池和ORM缺点
补充:垃圾回收机制.线程池和ORM缺点 垃圾回收机制不仅有引用计数,还有标记清除和分代回收 引用计数就是内存地址的门牌号,为0时就会回收掉,但是会出现循环引用问题,这种情况下会导致内存泄漏(即不会被用 ...
- .Net反射在项目中的应用
案例1:项目中可能有多个DAL程序集,每个程序集使用不同的持久化技术或对应不同类型的数据库,但是它们使用同一套接口. 可以在配置文件中配置DAL程序集名称,使用反射加载程序集.创建dal对象. 这样做 ...
- lower_case_table_names=1 启动报错 mysql8.0
我们知道在 Linux 环境下默认是区分大小写的,所以我们需要改变这种默认方式,经过网上各种搜索后,基本就是清一色的修改 lower_case_table_names,然后信誓旦旦的去修改了,但是修改 ...
- springMVC学习2
参数绑定 默认支持的参数类型 @Override public Item queryItemById(int id) { Item item = this.itemMapper.selectByPri ...
- date命令的FORMAT中输入空格的几种方法
1.date +%Y-%m-%d\ (一个空格)%H:%M:%S 此命令中用了转义字符 \ ,将空格转义出来 2.date +%Y-%m-%d' '%H:%M:%S 此命令中的单引号内可以是一个或多 ...
- restQL 微服务查询语言
restQL 是一个强大的微服务查询语言,类似sql,支持并行.链式.过滤.同时官方也提供了多种语言的实现 而且还有一个manger 与 graphql 以及Falcor的比较 以下是来自官方的比较说 ...
- [PHP] Elasticsearch 6.4.2 的安装和使用
Elasticsearch 6.4.2 的安装和使用 一.安装http://www.ruanyifeng.com/blog/2017/08/elasticsearch.htmlhttps://www. ...
- 基于Linux(中标麒麟)上QT的环境搭建
最近由于公司需要,需要在中标麒麟上进行QT的二次开发,但是网上的资料很少,就算是有也基本都是其他的版本的Linux上的搭建.中标麒麟本身的资料也很好,而且还只能试用60天. 下面就介绍下我对此环境的搭 ...
- IRQL
IRQL是Interrupt ReQuest Level,中断请求级别. 一个由windows虚拟出来的概念,划分在windows下中断的优先级,这里中断包括了硬中断和软中断,硬中断是由硬件产生,而软 ...