如果缺少实例,如何从SWT StyledText
中删除所有监听器?我尝试使用StyledText.getListeners(int)
方法获取所有实例,然后可以将其删除。但是,找到所有必需的int值很费力。这是最直接的方法吗?谢谢!
这是我的临时解决方案:
public void removeAllListener(StyledText st) {
int[] eventTypes = { 3007, 3011, SWT.Resize, SWT.Move, SWT.Dispose,
SWT.DragDetect, 3000, SWT.FocusIn, SWT.FocusOut, SWT.Gesture,
SWT.Help, SWT.KeyUp, SWT.KeyDown, 3001, 3002, SWT.MenuDetect,
SWT.Modify, SWT.MouseDown, SWT.MouseUp, SWT.MouseDoubleClick,
SWT.MouseMove, SWT.MouseEnter, SWT.MouseExit, SWT.MouseHover,
SWT.MouseWheel, SWT.Paint, 3008, SWT.Selection, SWT.Touch,
SWT.Traverse, 3005, SWT.Verify, 3009, 3010 };
for (int eventType : eventTypes) {
Listener[] listeners = st.getListeners(eventType);
for (Listener listener : listeners) {
st.removeListener(eventType, listener);
}
}
}
我必须复制一些值,因为它们是使用默认修饰符声明的
StyledText
类的一部分。因此,我无法访问它们。希望我不会错过任何int值;)
最佳答案
通常,没有机制可以做到这一点。但是,我设法通过子类化StyledText
使其工作。新类称为StyledTextWithListeners
。您可以根据需要将其重命名;)。但是,您将必须使用
styledText.addListenerByUser(int eventType, Listener listener);
给你添加
Listener
而不是styledText.addListener(int eventTyle, Listener listener);
这对于区分您添加的
Listener
和SWT创建时添加的Listener
很有必要。要删除用户(您)添加的所有监听器,只需调用
styledText.removeAllListeners();
这是代码:
import java.util.HashMap;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
public class MiniExample {
public static void main(String[] args) {
Display display = Display.getDefault();
final Shell shell = new Shell(display);
shell.setLayout(new GridLayout(1, false));
StyledTextWithListeners text = new StyledTextWithListeners(shell, SWT.BORDER);
text.setText("TEXT");
text.addListenerByUser(SWT.Verify, new Listener() {
@Override
public void handleEvent(Event arg0) {
}
});
text.removeAllListeners();
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
public static class StyledTextWithListeners extends StyledText
{
HashMap<Integer, Listener> listeners;
public StyledTextWithListeners(Composite parent, int style) {
super(parent, style);
}
public void addListenerByUser(int eventType, Listener listener)
{
addListener(eventType, listener);
System.out.println("Adding: " + listener.getClass().toString());
if(listeners == null)
listeners = new HashMap<Integer, Listener>();
listeners.put(eventType, listener);
}
public void removeAllListeners()
{
for(Integer type : listeners.keySet())
{
System.out.println("Removing: " + listeners.get(type).getClass().toString());
removeListener(type.intValue(), listeners.get(type));
}
listeners = new HashMap<Integer, Listener>();
}
}
}
基本上,它会保存您在
HashMap
中添加的所有removeAllListeners
,并在调用Listener
时将其删除。请记住,我没有考虑过像以前一样向第二个
eventType
添加另一个具有相同StyledText
的Listener
的情况。在这种情况下,旧的StyledText
将在HashMap中替换,但不会从ojit_code中删除。如果在您的情况下可能发生这种情况,请自己添加一些代码。关于java - SWT从StyledText删除所有监听器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12263199/