gpt4 book ai didi

java - SWT 从 StyledText 中移除所有监听器

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:15 27 4
gpt4 key购买 nike

如果我缺少实例,如何从 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 s 而不是

styledText.addListener(int eventTyle, Listener listener);

这是区分Listener 所必需的由您添加的和由 SWT 在创建时添加的。

要删除由用户(您)添加的所有监听器,只需调用

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>();
}
}
}

它基本上保存了所有Listener你添加一个 HashMap并在您调用 removeAllListeners 时删除它们.

请记住,我没有处理您添加第二个 Listener 的情况。与相同eventTypeStyledText像以前一样。在这种情况下,旧的 Listener将在 HashMap 中被替换,但不会从 StyledText 中删除.如果这种情况会出现在您的场景中,您只需自己添加一些代码即可。

关于java - SWT 从 StyledText 中移除所有监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12263199/

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