Как заменить AWQ EventQueue собственной реализацией

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

Это возможно? Как?

На всякий случай вы заинтересованы:

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

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

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

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

Это отлично. Расширение 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]

  • Установка цвета фона для JFrame
  • Пользовательская кнопка, не работающая с mac (ButtonUI)
  • Нарисуйте строку в JPanel с нажатием кнопки на Java
  • Рисование нескольких JComponents в рамку
  • Возможно ли иметь автозаполнение с использованием jtextfield и Jlist?
  • Как обрабатывать события с клавиатуры и мыши в полноэкранном эксклюзивном режиме в java?
  • Имея изображения в качестве фона JPanel
  • CombinedDomainXYPlot не перемасштабирует доменную ось
  • Обнаружение нескольких нажатий клавиш в java
  • Встраивание карт Google в приложение для Java-приложений
  • Java Swing Blank JFrame подходит?
  • Interesting Posts
    Давайте будем гением компьютера.