专栏首页10km的专栏java SWT:Display.addFilter设置快捷键的例子-切换全屏

java SWT:Display.addFilter设置快捷键的例子-切换全屏

版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/53536519

以前只知道org.eclipse.swt.widgets.Widget以及子类可以添加Listener。 今天才搞清楚: Display也有addListener方法,而且还有优先级更高的addFilter方法:

addFilter方法的原文说明: Adds the listener to the collection of listeners who will be notified when an event of the given type occurs anywhere in a widget. The event type is one of the event constants defined in class SWT. When the event does occur, the listener is notified by sending it the handleEvent() message. Setting the type of an event to SWT.None from within the handleEvent() method can be used to change the event type and stop subsequent Java listeners from running. Because event filters run before other listeners, event filters can both block other listeners and set arbitrary fields within an event. For this reason, event filters are both powerful and dangerous. They should generally be avoided for performance, debugging and code maintenance reasons.

从上面的说明可以知道使用addFilter方法添加Listener,可以拦截所有Widget的事件. so,利用addFilter方法的这个特性可以实现全局的快捷键。 如下代码实现了F11切换全屏状态

        // F11全局快捷键,在切换全屏
        Display.getDefault().addFilter(SWT.KeyDown, new Listener(){
            @Override
            public void handleEvent(Event e) {
                if(SWTKeySupport.convertEventToUnmodifiedAccelerator(e)==SWT.F11){
                    Control focusControl = Display.getDefault().getFocusControl();              
                    boolean fullScreen = !getShell().getFullScreen();
                    {
                        // 应用代码。。。。
                    }                   
                    getShell().setFullScreen(fullScreen);
                    //shell.setMaximized(fullScreen);
                    // 恢复焦点
                    if(null!=focusControl)
                        focusControl.forceFocus();
                    e.doit=false;
                }
            }});

如果在普通的Widget中加入全局热键,则要记得在dispose中删除Listener,否则如果widget被销毁后,产生热键事件时会抛出异常 TestAddFilter.java

package testwb;

import org.eclipse.jface.bindings.keys.SWTKeySupport;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

public class TestAddFilter extends Composite {
    // 侦听Ctrl-M键,实现全屏切换
    private final Listener ctrlmListener = new Listener() {
        @Override
        public void handleEvent(Event e) {
            if (SWTKeySupport.convertEventToUnmodifiedAccelerator(e) == (SWT.CTRL + 'M')) {
                System.out.println("Ctrl-M");
            }
        }
    };

    public TestAddFilter(Composite parent, int style) {
        super(parent, style);
        // 加入Ctrl-M全局快捷键监听
        getShell().getDisplay().addFilter(SWT.KeyDown, ctrlmListener);
        // 添加DisposeListener,对象被销毁时,删除filter
        addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                getShell().getDisplay().removeFilter(SWT.KeyDown, ctrlmListener);
            }
        });
    }
}

参考: http://help.eclipse.org/neon/nftopic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Display.html#addFilter-int-org.eclipse.swt.widgets.Listener-

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python爬虫者的福音!一个神库,汇总了数十个主流网站的模拟登陆方法

    网络上有形形色色的网站,不同类型的网站爬虫策略不同,难易程度也不一样。从是否需要登陆这方面来说,一些简单网站不需要登陆就可以爬,比如之前爬过的猫眼电影、东方财富...

    一墨编程学习
  • 图解人工智能,这群大学生做了个有趣的交互项目(中文版)

    网站链接:https://okai.brown.edu/zh/index.html

    机器之心
  • 极力推荐5款我一直在使用的Chrome优秀插件!

    Chrome浏览器是目前世界上使用率最高的浏览器,由于Chrome浏览器性能强悍、速度流畅、安全稳定、丰富的扩展插件库等众多优点备受网友热爱,其中也有很大一部分...

    小小詹同学
  • 基于 HTML5 WebGL 的计量站三维可视化监控系统 Web 组态工控应用 顶

    得益于 HTML5 WebGL 技术的成熟,从技术上对工控管理的可视化,数据可视化变得简单易行!完成对工控设备的管理效率,资源管理,风险管理等的大幅度提高,同时...

    HT_hightopo
  • Spring Boot支持文件上传

    十毛
  • 这些好用的网站,看看你都收藏了没!

    这两年收藏了不少网站,特地整理一下,把一些大家都可能用得上的分享出来,希望能对你有用。

    程序猿DD
  • 如何在 Web 关闭页面时发送 Ajax 请求

    有时候我们需要在用户离开页面的时候,做一些上报来记录用户行为。又或者是发送服务器ajax请求,通知服务器用户已经离开,比如直播间内的退房操作。

    grain先森
  • Spring Boot 2.x基础教程:快速入门

    在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不...

    程序猿DD
  • 剑走偏锋,robots.txt快速抓取网站的小窍门

    在我抓取网站遇到瓶颈,想剑走偏锋去解决时,常常会先去看下该网站的robots.txt文件,有时会给你打开另一扇抓取之门。

    一墨编程学习
  • 团队沟通之一个简单的需求是如何搞复杂的

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012839098/article/details/...

    栋先生

扫码关注云+社区

领取腾讯云代金券