Index: src/orca/settings.py
===================================================================
--- src/orca/settings.py	(revision 3949)
+++ src/orca/settings.py	(working copy)
@@ -697,6 +697,14 @@
 #
 asyncMode               = True
 
+# A list of toolkits whose events we need to process synchronously.
+# The only one right now is the Java toolkit (see bug #531869), but
+# we put this here to allow more toolkits to be more easily added
+# and for Java to be removed if issues with asynchronous processing
+# of its events are ever resolved.
+#
+synchronousToolkits     = ["J2SE-access-bridge"]
+
 # If True, we output debug information for the event queue.  We
 # use this in addition to log level to prevent debug logic from
 # bogging down event handling.
Index: src/orca/focus_tracking_presenter.py
===================================================================
--- src/orca/focus_tracking_presenter.py	(revision 3949)
+++ src/orca/focus_tracking_presenter.py	(working copy)
@@ -663,6 +663,8 @@
         - e: an at-spi event.
         """
 
+        asyncMode = settings.asyncMode
+
         if settings.debugEventQueue:
             if self._enqueueEventCount:
                 debug.println(debug.LEVEL_ALL,
@@ -735,6 +737,16 @@
                 debug.println(debug.LEVEL_ALL,
                               "---------> QUEUEING EVENT %s" % e.type)
 
+            # Some toolkits (e.g., Java - see bug #531869) need to
+            # have their events processed immediately.
+            #
+            try:
+                if event.host_application.toolkitName \
+                    in settings.synchronousToolkits:
+                    asyncMode = False
+            except:
+                pass
+
         if event:
             if settings.debugEventQueue:
                 debug.println(debug.LEVEL_ALL,
@@ -751,7 +763,7 @@
             if settings.debugEventQueue:
                 debug.println(debug.LEVEL_ALL,
                               "           ...put complete")
-            if settings.asyncMode and (not self._gidleId):
+            if asyncMode and (not self._gidleId):
                 if settings.gilSleepTime:
                     time.sleep(settings.gilSleepTime)
                 self._gidleId = gobject.idle_add(self._dequeueEvent)
@@ -764,7 +776,7 @@
                 debug.println(debug.LEVEL_ALL,
                               "           ...released")
 
-            if not settings.asyncMode:
+            if not asyncMode:
                 self._dequeueEvent()
 
         if settings.debugEventQueue:
