java - 如何通知复合 Material 的 child 收到/失去焦点?

标签 java events focus swt hierarchy

我有一个 SWT Composite,我需要将其传递给一些其他代码,这些代码将随意向其中添加子项。有什么方法可以通知复合 Material 的子项接收和失去焦点吗?

为了清楚起见,我不能为每个 child 添加监听器,因为我不负责创建这些控件。可以随时添加 child 。

最佳答案

正如 Favonius 所指出的,您可以 Hook 诸如 SWT.Resize 之类的布局事件,以确定您何时被绘制并重新计算您的子层次结构,并根据需要添加监听器。另一种选择是简单地监听所有 焦点事件,并且只关注那些与您感兴趣的控件相关的事件。

Display过滤器,它和监听器一样,被通知事件,但是过滤器的不同之处在于它们在监听器之前运行,它们有机会取消事件,并且在整个 Display 上通知他们所有类型的事件。

因此,您可以使用 Filter 来检查所有焦点事件并确定它是否是您感兴趣的事件。例如:

public class MyControl extends Composite
{
    private final Listener focusListener;

    public MyControl(final Composite parent, final int style)
    {
        /* initialize the control... */

        focusListener = new Listener()
        {
            public void handleEvent(Event event)
            {
                if (!(event.widget instanceof Control))
                {
                    return;
                }

                boolean isOurChild = false;
                for (Control c = (Control) event.widget; c != null; c = c.getParent())
                {
                    if (c == container)
                    {
                        isOurChild = true;
                        break;
                    }
                }

                if (isOurChild)
                {
                    System.out.println("Our child is " + (event.type == SWT.FocusIn ? "focused" : "unfocused"));
                }
            }
        };

        getDisplay().addFilter(SWT.FocusIn, focusListener);
        getDisplay().addFilter(SWT.FocusOut, focusListener);

        addDisposeListener(new DisposeListener()
        {
            public void widgetDisposed(DisposeEvent e)
            {
                getDisplay().removeFilter(SWT.FocusIn, focusListener);
                getDisplay().removeFilter(SWT.FocusOut, focusListener);
            }
        });
    }
}

请注意 javadoc for Display关于使用过滤器的警告:

They should generally be avoided for performance, debugging and code maintenance reasons.

显然,您正在考虑两种解决方案的性能权衡 - 根据您交付的应用程序类型和用户的工作流程,在调整大小时添加焦点监听器可能更有意义,或者它可能使更有意义的是简单地听取所有焦点事件并忽略那些你不感兴趣的。

关于java - 如何通知复合 Material 的 child 收到/失去焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9517634/

相关文章:

java - Hibernate OneToOne BiDirectional Optional Relationship : Works when inserted without optional object, 在使用新的可选对象更新时中断

java - 如何使用 printf 对项目进行分组?

iphone - -[自定义窗口 HitTest :withEvent:] implementation to forward events

jquery - 设置 jQuery 焦点

java - 跳转到 .txt 文件中的特定行,其中 Java 中所有行的长度相等

java - 生成空输出文件的 Map Reduce 作业

c# - Windows 服务中 COM 对象的事件处理

javascript - 让两个产品相互对话是使用 JavaScript 事件还是窗口函数更好?

WPF UserControl 交换并保留键盘焦点

jquery - 为什么这个输入框不触发 IE 上的焦点事件?