5

StyledTextインスタンスが見つからない場合、SWT からすべてのリスナーを削除するにはどうすればよいですか? メソッドを使用してすべてのインスタンスを取得しようとしましたが、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 値を見逃さなかったことを願っています ;)

4

1 に答える 1

4

一般に、これを行うメカニズムはありません。ただし、サブクラス化することでなんとか機能させることができましたStyledText。新しいクラスは と呼ばれStyledTextWithListenersます。必要に応じて名前を変更できます ;) . ただし、使用する必要があります

styledText.addListenerByUser(int eventType, Listener listener);

Listenerではなくあなたを追加する

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のと同じで秒を追加するケースを処理しなかったことに注意してください。この場合、古いものは HashMap で置き換えられますが、. このケースがシナリオで発生する可能性がある場合は、コードを自分で追加してください。eventTypeStyledTextListenerStyledText

于 2012-09-04T12:45:56.767 に答える