`

SWT窗口范围内的Lost Focus事件的实现

阅读更多
文章转自:http://blog.csdn.net/shrekmu/archive/2007/10/16/1826993.aspx
一、问题

    SWT中如果添加一个Lost Focus事件后,会发现当窗体切换、最小化窗体等事件发生的时候都会激发Lost Focus事件,这显然不过友善。传统意义上的Lost Focus事件应该是只有焦点迁移到单前窗体中的某个空间的时候才需要激发Lost Focus事件。但是由于RCP程序中,一个窗体可能包含多个View和Editor,所以这个Listener实现了当焦点迁移到指定 Composite中时,激发LostFocus事件。

二、事件代码

package study.swt.event;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

/** *//**
 * <b>系统名称:</b>Digital Cinema心得--SWT学习与使用<br>
 * <b>技能名称:</b>监听指定范围内lost Focus事件的监听器<br>
 * <b> 处理说明:</b>SWT中如果添加一个Lost Focus事件后,会发现当窗体切换、最小化窗体等事件发生的时候都会激发 Lost Focus事件,这显然不过友善。传统意义上的Lost Focus事件应该是只有焦点迁移到单前窗体中的某个空间的时候才需要激发 Lost Focus事件。但是由于RCP程序中,一个窗体可能包含多个View和Editor,所以这个Listener实现了当焦点迁移到指定 Composite中时,激发LostFocus事件。。<br>
 * <b>变革履历:</b>2007/10/16 MuChunYu Create<br>
 * <br>
 *
 * @author Mu ChunYu
 * @version 1.0 2007/07/04 初版
 * <p>
 */
public class FocusLostListener implements FocusListener ...{
   
    /** *//** 定义取得焦点范围的Composite */
    private Composite cmpParent = null;
   
    /** *//** 所监听的控件 */
    private Control ctl = null;

    /** *//** Gained Focus事件的过滤器 */
    private Listener filter = new Listener() ...{
        /** *//** 处理事件 */
        public void handleEvent(Event event) ...{
            // 判断是否是指定Composite中的空间取得了焦点
            if (isChildOf(cmpParent, (Control) event.widget)) ...{
                if (ctl != (Control) event.widget) ...{
                    cmpParent.getDisplay().removeFilter(SWT.FocusIn, filter);
                    dcFocusLost(new FocusEvent(event));
                }
            }
        }
       
        /** *//** 判断是否之指定Composite的子控件 */
        private boolean isChildOf(Composite cmpParent1, Control ctlChild) ...{
            Composite cltParent = ctlChild.getParent();
            while (cltParent != null) ...{
                if (cltParent == cmpParent1) ...{
                    return true;
                } else ...{
                    cltParent = cltParent.getParent();
                }
            }
            return false;
        }
    };

    /** *//**
     * <b>機能概要:</b> 构造函数。<br>
     * <br>
     * <b>処理フロー:</b> <br>
     * <ul>
     * <li>保存信息
     * <li>注册Focus监听器
     * </ul>
     *
     * @param cmpParent 定义取得焦点范围的Composite
     * @param ctl 所监听的控件
     * <p>
     */
    public DCFocusLostListener(Composite cmpParent, Control ctl) ...{
        this.cmpParent = cmpParent;
        this.ctl = ctl;
        ctl.addFocusListener(this);
    }

    /** *//**
     * <b>機能概要:</b> 取得焦点事件的处理。<br>
     * <br>
     * <b>処理フロー:</b> <br>
     * <ul>
     * <li>注册取得焦点事件的过滤器
     * </ul>
     *
     * @param event Focus事件
     * @deprecated 不需要使用。
     * <p>
     */
    @Override
    public void focusGained(FocusEvent event) ...{
        registerFilter();
    }

    /** *//**
     * <b>機能概要:</b> 注册取得焦点事件的过滤器。<br>
     * <br>
     * <b>処理フロー:</b> <br>
     * <ul>
     * <li>注册取得焦点事件的过滤器
     * </ul>
     *
     * <p>
     */
    public void registerFilter() ...{
        ctl.getDisplay().removeFilter(SWT.FocusIn, filter);
        ctl.getDisplay().addFilter(SWT.FocusIn, filter);
    }
   
    /** *//**
     * <b>機能概要:</b> 失去焦点事件的处理。<br>
     * <br>
     * <b>処理フロー:</b> <br>
     * <ul>
     * <li>无处理
     * </ul>
     *
     * @param event Focus事件
     * @since 1.0
     * @deprecated 不能使用。 使用dcFocusLost(FocusEvent event)
     * <p>
     */
    @Override
    public void focusLost(FocusEvent event) ...{
    }
   
    /** *//**
     * <b>機能概要:</b> 失去焦点事件的处理。<br>
     * <br>
     *
     * @param event Focus事件
     * @since 1.0
     * <p>
     */
    public void dcFocusLost(FocusEvent event) ...{
    }
}



三、使用方式
1、监听指定容器的Lost Focus事件
// 监听指定容器的Lost Focus事件
    DCFocusLostListener listenter = new DCFocusLostListener(cmpParent, m_Control) {
        public void dcFocusLost(FocusEvent event) {
            // TODO 业务处理
        }
    };
// 如果控件已经取得了焦点,就需要手工调用registerFilter()
    listenter.registerFilter();



2、监听窗体的Lost Focus事件
// 监听窗体的Lost Focus事件
    DCFocusLostListener listenter = new DCFocusLostListener(shell, m_Control) {
        public void dcFocusLost(FocusEvent event) {
            // TODO 业务处理
        }


    };
分享到:
评论

相关推荐

    使Excel嵌入到SWT窗口中

    使Excel嵌入到SWT窗口中 知识点一:Eclipse版本和jdk版本的选择 在本例中,我们使用的是Eclipse 3.3.1版本和jdk 5.0版本。Eclipse是一个开源的集成开发环境(IDE),它支持多种编程语言,包括Java、C++、Python等...

    SWT JFace 按键、事件、监听

    ### SWT JFace 按键、事件、监听 #### 概述 SWT(Standard Widget Toolkit)是Eclipse平台下的图形界面开发工具包,而JFace则是基于SWT之上的高级用户界面工具集。SWT提供了低级别的组件,用于创建跨平台的图形...

    swt 窗口设计演示

    详细描述了SWT组件的实际应用 详细在说明书

    java swt 窗口靠边自动隐藏

    我们可以通过添加这样的监听器来实现窗口靠边时的自动隐藏。 3. **Bounds**:Shell对象有一个Bounds属性,它包含了窗口的左上角坐标(x, y)和宽度(width)、高度(height)。我们可以检查窗口的Bounds来判断是否...

    swt table 实现换行

    根据提供的文件信息,可以看出本文主要讨论的是如何在 SWT (Standard Widget Toolkit) 的 Table 控件中实现文本换行的功能。SWT 是一个用于开发基于 Java 的桌面应用程序的工具包,它提供了丰富的用户界面组件来帮助...

    SWT 基本 窗口 组件

    java SWT 基本窗口 组件 开发

    swt事件处理的编码实现

    在SWT中,我们可以通过实现`MouseListener`接口来监听鼠标事件。`MouseListener`接口包含三个方法:`mouseDown()`, `mouseUp()`, 和 `mouseDoubleClick()`。在这个例子中,我们关心的是`mouseDoubleClick()`方法。...

    SWT事件一览表

    SWT事件处理机制是其核心特性之一,它允许开发者响应各种用户交互行为,从而实现动态和响应式的界面设计。 ### SWT事件类型及处理 #### ControlEvent:控件事件 - **监听器和适配器**:`ControlListener`和`...

    SWT创建Shell窗口

    本篇将详细讲解如何使用SWT来创建一个基本的Shell窗口。 首先,我们需要理解Shell在SWT中的含义。Shell是SWT中的顶级窗口,类似于其他GUI库中的Frame或Window。它是应用程序的主窗口,可以包含各种控件,如按钮、...

    SWT.rar_SWT tutorial_java swt_swt 登陆窗口_swt tutori_swt-designer

    在压缩包内的文件中,"SWT.pdf"可能是完整的SWT教程文档,详细阐述了SWT的各个方面,包括组件的使用、布局管理、事件处理等。而"www.pudn.com.txt"可能是来源于发布或下载这个教程的网站的链接或者说明,可能包含了...

    SWT_AWT_Swing事件处理机制

    因此,在SWT中处理事件通常需要在`handleEvent`方法内根据事件类型进行判断。 对比三者,AWT的事件处理相对简单但略显笨重,Swing提供了更丰富的功能和更优雅的代码结构,而SWT则强调与原生系统的紧密集成和高性能...

    SWT隐藏任务栏图标

    在SWT中,窗口(Shell)是应用程序的基本容器,它在任务栏上显示为一个图标。默认情况下,Shell会自动创建并显示任务栏图标。要实现隐藏任务栏图标的功能,我们需要深入理解SWT的内部机制,并可能需要对源码进行一定...

    SWT视频播放器

    这个"SWT视频播放器"项目显然是一款利用SWT库来实现的视频播放软件,它具有基本的视频播放功能,能够加载并播放视频文件。 在深入探讨SWT视频播放器的相关知识点之前,我们先来了解一下SWT本身。SWT是Java中替代AWT...

    swt背景拖动不将图片拖出窗口

    // 更新图片位置,确保其在Shell范围内 // 这里需要具体计算,保持图片和shell的相对位置不变 }); ``` 5. **处理窗口大小变化**: 当窗口大小改变时,我们也需要同步调整图片的大小,以保持背景的完整: ```...

    SWT/JFACE客户端登录窗口例子

    在这个“SWT/JFACE 客户端登录窗口例子”中,我们可以预期会看到如何使用这两个库来创建一个基本的登录窗口。通常,这样的窗口会包含用户名和密码输入框,以及登录、取消等按钮。以下是一些可能涉及的知识点: 1. *...

    SWT自定义圆形按钮

    SWT原生按钮不够美观,本案例实现自定义圆形按钮,代码可直接下载使用。

    swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位

    SWT的设计目标是提供一个与平台相关的、高效的GUI库,它通过直接调用操作系统API来实现,而不是像Java Swing那样依赖Java抽象窗口工具包(AWT)和Java 2D。这种设计使得SWT应用程序在性能上通常优于Swing,并且可以...

    Java使用SWT技术实现跳棋游戏.rar

    另外,为了增加用户体验,开发者可能还实现了动画效果,如棋子移动的过程,这需要利用 SWT 的定时器(Timer)功能,通过在一定时间间隔内更新棋子的位置来模拟动态效果。 压缩包中的"codesc.net"可能是源代码文件,...

    SWT详细精解

    这本书可能详细讲解了如何在Eclipse环境中使用SWT和JFace进行实际开发,包括创建窗口、添加组件、处理事件、设计布局、数据绑定等方面,还可能包含了一些实用技巧和最佳实践。 总之,SWT为Java开发者提供了一个...

    SWT界面化计算器

    在这个名为"四则运算计算器SWT版"的项目中,我们主要讨论的是如何利用SWT来实现一个具有基本四则运算(加、减、乘、除)以及括号运算功能的计算器应用。 首先,我们需要了解SWT的核心概念。SWT是基于操作系统原生的...

Global site tag (gtag.js) - Google Analytics