我想在我的自定义控件中添加一个Selection Listener,它包含几个按钮,这样无论何时单击一个按钮,控件都应该执行一个特定的功能。问题是:我想将监听器添加到控件本身,而不是单独添加到每个子按钮。我该怎么办?
答案 0 :(得分:1)
来自文章Creating Your Own Widgets using SWT:
SWT事件机制
SWT提供了一个低级侦听器机制以及通常的Java“类型”侦听器。每个SWT小部件都了解addListener(int eventType,Listener listener)和notifyListeners(int eventType,Event event)。 eventType常量在类SWT中定义。发生事件时,窗口小部件会创建一个包含相应类型常量的SWT事件对象。 notifyListeners方法为监听器调用handleEvent(Event事件)。如果您需要重用现有的SWT事件,通常会使用此机制。
例如,如果您的窗口小部件实现了一个选择事件,您可以按如下方式实现“键入”添加和删除方法:
public void addSelectionListener(SelectionListener listener) { addListener(SWT.Selection, new TypedListener(listener)); } public void removeSelectionListener(SelectionListener listener) { removeListener(SWT.Selection, listener); }
当您的窗口小部件中出现“选择事件”时(例如,当选择了child1时),您将使用notifyListeners通知应用程序的选择侦听器。
child1.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { notifyListeners(SWT.Selection, new Event()); } });
请注意,当我们添加侦听器时,我们首先将它包装在TypedListener中。这是因为TypedListener的handleEvent(Event事件)方法根据Event中的类型创建相应的TypedEvent子类,然后为类型化事件调用适当的方法。通过这种方式,应用程序可以向窗口小部件添加Java类型的侦听器,但窗口小部件实现可以使用更有效的低级侦听器机制。但是,请确保您的窗口小部件实现提供了类型化的侦听器API。应用程序不应该调用低级侦听器方法。类型化的侦听器方法可以防止意外的编程错误,例如假设所有小部件都可以处理所有类型的事件,或者Event类中的所有字段对所有事件都有效。