eventqueue.java

来自「Mac OS X 10.4.9 for x86 Source Code gcc」· Java 代码 · 共 552 行 · 第 1/2 页

JAVA
552
字号
      next_in = 0;    if (next_in == next_out)      {        /* Queue is full. Extend it. */        AWTEvent[] oldQueue = queue;        queue = new AWTEvent[queue.length * 2];        int len = oldQueue.length - next_out;        System.arraycopy(oldQueue, next_out, queue, 0, len);        if (next_out != 0)          System.arraycopy(oldQueue, 0, queue, len, next_out);        next_out = 0;        next_in = oldQueue.length;      }        if (dispatchThread == null || !dispatchThread.isAlive())      {        dispatchThread = new EventDispatchThread(this);        dispatchThread.start();      }    // Window events might represent the closing of a window, which    // might cause the end of the dispatch thread's life, so we'll wake    // it up here to give it a chance to check for shutdown.    if (!isDispatchThread()         || (evt.getID() == WindowEvent.WINDOW_CLOSED)        || (evt.getID() == WindowEvent.WINDOW_CLOSING))      ((ClasspathToolkit) Toolkit.getDefaultToolkit()).wakeNativeQueue();    notify();  }  /**   * Causes runnable to have its run method called in the dispatch thread of the   * EventQueue. This will happen after all pending events are processed. The   * call blocks until this has happened. This method will throw an Error if   * called from the event dispatcher thread.   *   * @exception InterruptedException If another thread has interrupted   * this thread.   * @exception InvocationTargetException If an exception is thrown when running   * runnable.   *   * @since 1.2   */  public static void invokeAndWait(Runnable runnable)    throws InterruptedException, InvocationTargetException  {    if (isDispatchThread ())      throw new Error("Can't call invokeAndWait from event dispatch thread");    EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();     Thread current = Thread.currentThread();    InvocationEvent ie =       new InvocationEvent(eq, runnable, current, true);    synchronized (current)      {        eq.postEvent(ie);        current.wait();      }    Exception exception;    if ((exception = ie.getException()) != null)      throw new InvocationTargetException(exception);  }  /**   * This arranges for runnable to have its run method called in the   * dispatch thread of the EventQueue.  This will happen after all   * pending events are processed.   *   * @since 1.2   */  public static void invokeLater(Runnable runnable)  {    EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();     InvocationEvent ie =       new InvocationEvent(eq, runnable, null, false);    eq.postEvent(ie);  }  /**   * Return true if the current thread is the current AWT event dispatch   * thread.   */  public static boolean isDispatchThread()  {    EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();        /* Find last EventQueue in chain */     while (eq.next != null)      eq = eq.next;    return (Thread.currentThread() == eq.dispatchThread);  }  /**   * Return the event currently being dispatched by the event   * dispatch thread.  If the current thread is not the event   * dispatch thread, this method returns null.   *   * @since 1.4   */  public static AWTEvent getCurrentEvent()  {    EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();     Thread ct = Thread.currentThread();        /* Find out if this thread is the dispatch thread for any of the       EventQueues in the chain */     while (ct != eq.dispatchThread)      {        // Try next EventQueue, if any        if (eq.next == null)           return null;  // Not an event dispatch thread        eq = eq.next;      }    return eq.currentEvent;  }  /**   * Allows a custom EventQueue implementation to replace this one.    * All pending events are transferred to the new queue. Calls to postEvent,   * getNextEvent, and peekEvent and others are forwarded to the pushed queue   * until it is removed with a pop().   *   * @exception NullPointerException if newEventQueue is null.   */  public synchronized void push(EventQueue newEventQueue)  {    if (newEventQueue == null)      throw new NullPointerException ();    /* Make sure we are at the top of the stack because callers can       only get a reference to the one at the bottom using       Toolkit.getDefaultToolkit().getSystemEventQueue() */    if (next != null)      {        next.push (newEventQueue);        return;      }    /* Make sure we have a live dispatch thread to drive the queue */    if (dispatchThread == null)      dispatchThread = new EventDispatchThread(this);    int i = next_out;    while (i != next_in)      {        newEventQueue.postEvent(queue[i]);        next_out = i;        if (++i == queue.length)          i = 0;      }    next = newEventQueue;    newEventQueue.prev = this;      }  /** Transfer any pending events from this queue back to the parent queue that    * was previously push()ed. Event dispatch from this queue is suspended.    *    * @exception EmptyStackException If no previous push was made on this    * EventQueue.    */  protected void pop() throws EmptyStackException  {    if (prev == null)      throw new EmptyStackException();    /* The order is important here, we must get the prev lock first,       or deadlock could occur as callers usually get here following       prev's next pointer, and thus obtain prev's lock before trying       to get this lock. */    synchronized (prev)      {        prev.next = next;        if (next != null)          next.prev = prev;        synchronized (this)          {            int i = next_out;            while (i != next_in)              {                prev.postEvent(queue[i]);                next_out = i;                if (++i == queue.length)                  i = 0;              }	    // Empty the queue so it can be reused	    next_in = 0;	    next_out = 0;            ((ClasspathToolkit) Toolkit.getDefaultToolkit()).wakeNativeQueue();            setShutdown(true);	    dispatchThread = null;            this.notifyAll();          }      }  }  /**   * Dispatches an event. The manner in which the event is dispatched depends   * upon the type of the event and the type of the event's source object.   *   * @exception NullPointerException If event is null.   */  protected void dispatchEvent(AWTEvent evt)  {    currentEvent = evt;    if (evt instanceof InputEvent)      lastWhen = ((InputEvent) evt).getWhen();    else if (evt instanceof ActionEvent)      lastWhen = ((ActionEvent) evt).getWhen();    else if (evt instanceof InvocationEvent)      lastWhen = ((InvocationEvent) evt).getWhen();    if (evt instanceof ActiveEvent)      {        ActiveEvent active_evt = (ActiveEvent) evt;        active_evt.dispatch();      }    else      {        Object source = evt.getSource();        if (source instanceof Component)          {            Component srccmp = (Component) source;            srccmp.dispatchEvent(evt);          }        else if (source instanceof MenuComponent)          {            MenuComponent srccmp = (MenuComponent) source;            srccmp.dispatchEvent(evt);          }      }  }  /**   * Returns the timestamp of the most recent event that had a timestamp, or   * the initialization time of the event queue if no events have been fired.   * At present, only <code>InputEvent</code>s, <code>ActionEvent</code>s,   * <code>InputMethodEvent</code>s, and <code>InvocationEvent</code>s have   * timestamps, but this may be added to other events in future versions.   * If this is called by the event dispatching thread, it can be any   * (sequential) value, but to other threads, the safest bet is to return   * System.currentTimeMillis().   *   * @return the most recent timestamp   * @see InputEvent#getWhen()   * @see ActionEvent#getWhen()   * @see InvocationEvent#getWhen()   * @see InputMethodEvent#getWhen()   * @since 1.4   */  public static long getMostRecentEventTime()  {    EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();     if (Thread.currentThread() != eq.dispatchThread)      return System.currentTimeMillis();    return eq.lastWhen;  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?