EventDispatchThread.java revision 0
0N/A * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. 2362N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. Sun designates this 2362N/A * particular file as subject to the "Classpath" exception as provided 0N/A * by Sun in the LICENSE file that accompanied this code. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 0N/A * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 2362N/A * CA 95054 USA or visit www.sun.com if you need additional information or 0N/A * EventDispatchThread is a package-private AWT class which takes 0N/A * events off the EventQueue and dispatches them to the appropriate 0N/A * The Thread starts a "permanent" event pump with a call to 0N/A * pumpEvents(Conditional) in its run() method. Event handlers can choose to 0N/A * block this event pump at any time, but should start a new pump (<b>not</b> 0N/A * a new EventDispatchThread) by again calling pumpEvents(Conditional). This 0N/A * secondary event pump will exit automatically as soon as the Condtional 0N/A * evaluate()s to false and an additional Event is pumped and dispatched. 0N/A * @author Amy Fowler 0N/A * @author David Mendenhall 0N/A // used in handleException 0N/A // Note: We stop dispatching via a flag rather than using 0N/A // Thread.interrupt() because we can't guarantee that the wait() 0N/A // we interrupt will be EventQueue.getNextEvent()'s. -fredx 8-11-98 0N/A // wait for the dispatcher to complete 0N/A // fix 4122683, 4128923 0N/A // Post an empty event to ensure getNextEvent is unblocked 0N/A // We have to use postEventPrivate instead of postEvent because 0N/A // EventQueue.pop calls EventDispatchThread.stopDispatching. 0N/A // Calling SunToolkit.flushPendingEvents in this case could 0N/A // lead to deadlock. 0N/A * This synchronized block is to secure that the event dispatch 0N/A * thread won't die in the middle of posting a new event to the 0N/A * associated event queue. It is important because we notify 0N/A * that the event dispatch thread is busy after posting a new event 0N/A * to its queue, so the EventQueue.dispatchThread reference must 0N/A * be valid at that point. 0N/A * Event dispatch thread dies in case of an uncaught exception. 0N/A * A new event dispatch thread for this queue will be started 0N/A * only if a new event is posted to it. In case if no more 0N/A * events are posted after this thread died all events that 0N/A * currently are in the queue will never be dispatched. 0N/A * Fix for 4648733. Check both the associated java event 0N/A * queue and the PostEventQueue. return false;
// AppContext.dispose() interrupts all // Threads in the AppContext // Can get and throw only unchecked exceptions // If we are in a modal dialog, we cannot throw // an exception for the ThreadGroup to handle (as added // in RFE 4063022). If we did, the message pump of // the modal dialog would be interrupted. // We instead choose to handle the exception ourselves. // It may be useful to add either a runtime flag or API // later if someone would like to instead dispose the // dialog and allow the thread group to handle it. "Exception occurred during event dispatching:");
}
else if (e
instanceof Error) {
* Handles an exception thrown in the event-dispatch thread. * <p> If the system property "sun.awt.exception.handler" is defined, then * when this method is invoked it will attempt to do the following: * <li> Load the class named by the value of that property, using the * current thread's context class loader, * <li> Instantiate that class using its zero-argument constructor, * <li> Find the resulting handler object's <tt>public void handle</tt> * method, which should take a single argument of type * <tt>Throwable</tt>, and * <li> Invoke the handler's <tt>handle</tt> method, passing it the * <tt>thrown</tt> argument that was passed to this method. * If any of the first three steps fail then this method will return * <tt>false</tt> and all following invocations of this method will return * <tt>false</tt> immediately. An exception thrown by the handler object's * <tt>handle</tt> will be caught, and will cause this method to return * <tt>false</tt>. If the handler's <tt>handle</tt> method is successfully * invoked, then this method will return <tt>true</tt>. This method will * never throw any sort of exception. * <p> <i>Note:</i> This method is a temporary hack to work around the * absence of a real API that provides the ability to replace the * event-dispatch thread. The magic "sun.awt.exception.handler" property * <i>will be removed</i> in a future release. * @param thrown The Throwable that was thrown in the event-dispatch * @return <tt>false</tt> if any of the above steps failed, otherwise return false;
/* Already tried, and failed */ /* Look up the class name */ /* Load the class, instantiate it, and find its handle method */ /* Finally, invoke the handler */ * filter out MouseEvent and ActionEvent that's outside * the modalComponent hierarchy. * KeyEvent is handled by using enqueueKeyEvent * Modal internal frames are handled separately. If event is * for some component from another heavyweight than modalComp, * it is accepted. If heavyweight is the same - we still accept * event and perform further filtering in LightweightDispatcher // Exclude this object from modality and // continue to pump it's events. // Exclude this window and all its children from // modality and continue to pump it's events.