23

Swing アプリケーションの奇妙な動作をデバッグするために、AWT EventQueue を独自の実装に置き換えたいと考えています。

これは可能ですか?どのように?

興味がある場合に備えて:

  • 実装は、通常の Eventqueue の単純なラッパーであり、ログを記録します。

  • 私がデバッグしたい問題は、TableCellEditor です。これは、小さなデモ アプリでは問題なく動作しますが、実際のアプリケーションに入れると、何らかのイベントのために stopCellEditing がすぐに呼び出されます。どこから来ているかを知るために、イベントにアクセスしたいと思います。

4

3 に答える 3

25

EventQueue には、正確に必要なことを行う push() というメソッドがあります。ここに小さなデモがあります:

public class QueueTest {
    public static void main(String[] args) throws InterruptedException, InvocationTargetException {
        EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
        eventQueue.push(new MyEventQueue());

        EventQueue.invokeAndWait(new Runnable() {
            public void run() {
                System.out.println("Run");
            }
        });
    }

    private static class MyEventQueue extends EventQueue {
        public void postEvent(AWTEvent theEvent) {
            System.out.println("Event Posted");
            super.postEvent(theEvent);
        }
    }
}
于 2010-07-01T13:50:43.287 に答える
16

java1.7には注意してください。バグがあります。rancidfishbreathによって投稿されたソリューションは、Java 1.6で完璧ですが、Java1.7で終了することのないSwingアプリケーションになります。JDK 1.7では、新しいEvenQueueをイベントディスパッチスレッドにインストールする必要があります...そしてJDK 1.6ではその外部にインストールする必要があります...一度書き込み、どこでも実行します;-)

これが普遍的な解決策です...希望、1.8はそれを変えません;-)

import java.awt.AWTEvent;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.lang.reflect.InvocationTargetException;

public class QueueTest {
    public static void main(String[] args) throws InterruptedException, InvocationTargetException {
        if (!isJava7Like()) setQueue();

        EventQueue.invokeAndWait(new Runnable() {
            public void run() {
                if (QueueTest.isJava7Like()) setQueue();
                System.out.println("Run");
            }
        });
    }

    private static void setQueue() {
        EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
        eventQueue.push(new MyEventQueue());
    }

    private static boolean isJava7Like() {
        return Float.parseFloat(System.getProperty("java.specification.version")) > 1.6;
    }

    private static class MyEventQueue extends EventQueue {
        public void postEvent(AWTEvent theEvent) {
            System.out.println("Event Posted");
            super.postEvent(theEvent);
        }
    }
}
于 2012-01-22T22:53:13.070 に答える
1

これで問題ありません。EventQueue を拡張すると、すべての AWTEvents のハンドルが得られます。

すべてのイベントをどのように処理しますか。イベント一覧は以下の通りです。

[AWTEvent、BeanContextEvent、CaretEvent、ChangeEvent、ConnectionEvent、DragGestureEvent、DragSourceEvent、DropTargetEvent、FlavorEvent、HandshakeCompletedEvent、HyperlinkEvent、LineEvent、ListDataEvent、ListSelectionEvent、MenuEvent、NamingEvent、NamingExceptionEvent、NodeChangeEvent、通知、PopupMenuEvent、PreferenceChangeEvent、PrintEvent、PropertyChangeEvent、RowSetEvent、RowSorterEvent 、SSLSessionBindingEvent、StatementEvent、TableColumnModelEvent、TableModelEvent、TreeExpansionEvent、TreeModelEvent、TreeSelectionEvent、UndoableEditEvent、UnsolicitedNotificationEvent]

于 2014-10-29T13:01:36.850 に答える