gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:14:55 27 4
gpt4 key购买 nike

我有一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com