systemalert.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 204 行

JAVA
204
字号
/* *   * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */package com.sun.midp.lcdui;import javax.microedition.lcdui.*;import com.sun.midp.events.EventQueue;import com.sun.midp.log.Logging;import com.sun.midp.log.LogChannels;import com.sun.midp.security.SecurityToken;import com.sun.midp.security.Permissions;/** * Display a preempting alert and wait for the user to acknowledge it. */public class SystemAlert extends Alert    implements CommandListener, Runnable {    /** Preempt token for displaying errors. */    private Object preemptToken;    /** The display event handler for displaying errors. */    private DisplayEventHandler displayEventHandler;    /** Explicit command lstener for this alert, null if not set. */    private CommandListener explicitListener;    /** Synchronization lock for setting explicit command listener. */    private final Object listenerLock = new Object();    /** Flag to identify if the alert is being displayed currently. */    private boolean shown = false;    /**     * Construct an <code>SystemAlert</code>.     *     * @param displayEventHandler The display event handler for error display     * @param title The title of the <tt>Alert</tt>     * @param text The text of the <tt>Alert</tt>     * @param image An <tt>Image</tt> to display on the <tt>Alert</tt>     * @param type The <tt>Alert</tt> type     */    public SystemAlert(DisplayEventHandler displayEventHandler,                       String title, String text,                       Image image, AlertType type) {        super(title, text, image, type);        setTimeout(Alert.FOREVER);        super.setCommandListener(this);        this.displayEventHandler = displayEventHandler;    }    /**     * Construct an <code>SystemAlert</code>.     *     * @param securityToken The <tt>SecurityToken</tt>      * @param title The title of the <tt>Alert</tt>     * @param text The text of the <tt>Alert</tt>     * @param image An <tt>Image</tt> to display on the <tt>Alert</tt>     * @param type The <tt>Alert</tt> type     */    public SystemAlert(SecurityToken securityToken,                       String title, String text,                       Image image, AlertType type) {        super(title, text, image, type);	securityToken.checkIfPermissionAllowed(Permissions.MIDP);        this.displayEventHandler = 	    DisplayEventHandlerFactory.getDisplayEventHandler(securityToken);        setTimeout(Alert.FOREVER);        super.setCommandListener(this);    }    /** Waits for the user to acknowledge the alert. */    public synchronized void waitForUser() {        if (!shown) {            return;        }        if (EventQueue.isDispatchThread()) {            // Developer programming error            throw new RuntimeException(                "Blocking call performed in the event thread");        }        try {            wait();        } catch (Throwable t) {            if (Logging.REPORT_LEVEL <= Logging.WARNING) {                Logging.report(Logging.WARNING, LogChannels.LC_CORE,                              "Throwable while SystemAlert.waitForUser");            }        }    }    /** Dismiss the alert */    public synchronized void dismiss() {        if (shown) {            notify(); // wait up waitForUser() thread            displayEventHandler.donePreempting(preemptToken);            preemptToken = null;            shown = false;        }    }    /**     * Respond to a command issued on this alert.     *     * @param c command activated by the user     * @param s the Displayable the command was on.     */    public void commandAction(Command c, Displayable s) {        synchronized (listenerLock) {            if (null != explicitListener) {                explicitListener.commandAction(c, s);            } else {                dismiss();            }        }    }    /**     * Assigns explicit command listener to this alert. If an non-null     * explcit listener its commandAction() method is called to process     * a command, otherwise default dismiss() action is used.     *     * @param cl expilict command listener, null to remove any explicit     *          listener     */    public void setCommandListener(CommandListener cl) {        synchronized (listenerLock) {            explicitListener = cl;        }    }    /**     * Displays this alert. Since alert displaying may be blocking, it is     * not allowed in the event dispatching thread. Nothing is done when     * the method is called from the dispatching thread, to produce a     * system alert from ituse runInNewThread(). Nothing is done if the     * alert is being displayed currently.     */    public synchronized void run() {        shown = true;        if (preemptToken != null) {            return;        }        try {            preemptToken =                displayEventHandler.preemptDisplay(this, true);        } catch (Throwable e) {            if (Logging.REPORT_LEVEL <= Logging.WARNING) {                Logging.report(Logging.WARNING, LogChannels.LC_CORE,                              "Throwable while preempting Display");            }        }    }    /**     * Launches a new thread and displays this alert from it. Use this method     * to avoid blocking a thread that produces the alert. Makes nothing if     * the alert is being displayed currently.     */    public synchronized void runInNewThread() {        shown = true;        new Thread(this).start();    }}

⌨️ 快捷键说明

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