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