2010-07-01 4 views
21

Чтобы отладить странное поведение в Swing-приложении, я бы хотел заменить AWQ EventQueue своей собственной реализацией.Как заменить AWT EventQueue собственной реализацией

Возможно ли это? Как?

Только в случае, если вы заинтересованы:

  • реализация будет простой оберткой нормального EventQueue, делать некоторые протоколирования.

  • Проблема, которую я хотел бы отлаживать, - это TableCellEditor, который отлично работает в небольшом демонстрационном приложении, но когда он помещается в реальное приложение, stopCellEditing вызывается немедленно из-за некоторого события. Я хотел бы получить доступ к мероприятию, чтобы узнать, откуда он идет.

+0

Будет ли [регистрируя AWTEventListener] (http://docs.oracle.com/javase/6/docs/api /java/awt/Toolkit.html#addAWTEventListener%28java.awt.event.AWTEventListener,%20long%29) будет более простым soluti на? – prunge

+0

@ andrew-barber Как этот вопрос слишком широк? У этого есть два очень приятных кратких ответа, для разных java-версий –

ответ

23

В 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); 
     } 
    } 
} 
+0

Я мог ошибаться, но я думаю, что проблема заключается не в подклассе 'EventQueue', а в том, как заставить AWT/Swing использовать его вместо' EventQueue '. – Powerlord

+3

Но это именно то, что кажется толчком. Из javadoc: push (EventQueue newEventQueue) Заменяет существующий EventQueue на указанный. –

+0

Работает как шарм. –

14

Будьте осторожны с java 1.7. Есть bug. Решение, размещенное rancidfishbreath, отлично с java 1.6, но приводит к применению Swing, которое никогда не выходит с java 1.7. Под JDK 1.7 вам нужно установить новый EvenQueue в потоке Dispatch Event ... и вне его в 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); 
     } 
    } 
} 
+0

Интересно - хотя я замечаю, что ключевые события и события мыши (те, которые меня интересуют) не отправляются в «пост», а пересылаются из очереди системных событий в «postEventPrivate()», которые нельзя переопределить даже с помощью полный доступ. : | – peterk

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]

Смежные вопросы