程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> MIDP高級UI的使用(四)Alert

MIDP高級UI的使用(四)Alert

編輯:關於JAVA

這個類比較有意思,它是用來提醒用戶關於錯誤或者其他異常情況的屏幕對象,這個警告只能作為簡短的信息記錄和提醒,如果我們需要長一點的,我們可以使用其它的Screen 子類,最常見的是Form 。同時我們順便提一下和它相關的一個類AlertType ,需要提醒讀者注意的一點是AlertType 是一個本身無法實例化的工具類。(即我們不能像Form 那樣產生具體對象)

AlertType 共有5 個類型:ALARM (警報),CONFIRMATION (確定),ERROR (錯誤),INFO (信息提示),WARNING (警告)。

Alert 是一個比較特殊的屏幕對象,當我們在setCurrent() 方法中調用它的時候,它會先發出一段警告的聲音,然後才會顯示在屏幕上,過了一段時間後,它會自動跳回之前的畫面。

我們需要注意的是我們必須在使用setCurrent() 顯示Alert 之前定義好它可以跳回的畫面,否則會發生異常。

在Alert 中我們可以通過setTimeout() 方法來設定間隔的時間,setType() 來調用上面提到的幾種類型,setImage() 來定義圖片,setString() 來定義內含文字,同時通過getType() ,getImage() ,getString() 來取得相應的對象。

可以利用setTimeout() 來定義Alert() 顯示的時間,當Alert 在屏幕上顯示了我們指定的時間間隔後,它會跳回我們指定的屏幕對象,或回到前一個屏幕。如果我們調用setTimeout() 時傳入Alert.FORVEER 作為參數,那麼除非用戶按下指定鍵,否則屏幕會一直顯示這個Alert 。如果在一個定時的Alert 中只有一個命令,那麼超時發生時命令會自動激活。

下面是一個簡單的Alert例子:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */  

package com.thinkrace.Alert;
  
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
import javax.microedition.midlet.*;

/**
 * @author pengjw 
 */
public class AlertDemo extends MIDlet {
  private static final Command CMD_EXIT = new Command("Exit", Command.EXIT,1);
   private static final Command CMD_SHOW = new Command("Show", Command.SCREEN,1);
   private static final String[] typeStrings ={
    "Alarm", "Confirmation", "Error", "Info", "Warning"
   };
   private static final String[] timeoutStrings ={
    "2 seconds", "4seconds", "8 seconds", "Forever"
   };
   private static final int SECOND = 1000;
   private Display display;
   private boolean firstTime;
   private Form mainForm;
  
   public AlertDemo(){
     firstTime = true;
     mainForm = new Form("Alert Options");
   }
  public void startApp() {
    display = Display.getDisplay(this);
    showOption();
  }
  /**
   * 制造這個MIDlet的基本顯示
   * 在這個Form裡面我們可以選擇Alert的各種類型和特性
   */
  private void showOption(){
    if(firstTime){
      /**
       * 來自文檔的說明,ChoiceGroup類就是選項組,可以根據它的類型來決定它是單選還是多選,很像List類
       * A ChoiceGroup is a group of selectable elements intended to be placed within a Form.
       * The group may be created with a mode that requires a single choice to be made or that allows multiple choices. 
       * 以下用的是這種構造函數來創建ChoiceGroup的
       * public ChoiceGroup(String label,
          int choiceType,
          String[] stringElements,
          Image[] imageElements)
       */
      ChoiceGroup types = new ChoiceGroup("Type",ChoiceGroup.POPUP,typeStrings,null);
      mainForm.append(types);
      ChoiceGroup timeouts = new ChoiceGroup("Timeout",ChoiceGroup.POPUP,timeoutStrings,null);
      mainForm.append(timeouts);
      String[] optionStrings = {"Show Indicator"};
      ChoiceGroup options = new ChoiceGroup("Options", ChoiceGroup.MULTIPLE, optionStrings,null);
      mainForm.append(options);
      mainForm.addCommand(CMD_SHOW);
      mainForm.addCommand(CMD_EXIT);
      mainForm.setCommandListener(new AlertListener(types, timeouts, options));
      firstTime = false;
    }
    //設置當前顯示的窗體
    display.setCurrent(mainForm);
  }

  //聲明一個內部類,繼承CommandListener接口
  private class AlertListener implements CommandListener{
    //在內部類裡面聲明幾個字段
    AlertType[] alertTypes ={
      AlertType.ALARM, AlertType.CONFIRMATION, AlertType.ERROR, AlertType.INFO, AlertType.WARNING
    };
    ChoiceGroup typesCG;
    int[] timeouts = { 2 * SECOND,4 * SECOND,8 * SECOND, Alert.FOREVER };
    ChoiceGroup timeoutsCG;
    ChoiceGroup indicatorCG;
  
    public AlertListener(ChoiceGroup types, ChoiceGroup timeouts, ChoiceGroup indicator){
      typesCG = types;
      timeoutsCG = timeouts;
      indicatorCG = indicator;
    }
  
    //實現CommandListener接口中的抽象方法,根據相應的Command對象,表現相應的行為
    public void commandAction(Command c, Displayable d) {
      if(c == CMD_SHOW){
        //獲取ChoiceGroup的選擇項  
        int typeIndex = typesCG.getSelectedIndex();
        Alert alert = new Alert("Alert");
        alert.setType(alertTypes[typeIndex]);
  
        int timeoutIndex = timeoutsCG.getSelectedIndex();
        alert.setTimeout(timeouts[timeoutIndex]);
        alert.setString(typeStrings[typeIndex]+" Alert, Running "+ timeoutStrings[timeoutIndex]);
  
        boolean[] SelectedFlags = new boolean[1];
        //getSelectedFlags()能夠獲取ChoiceGroup中的每一個元素是否被選中,0代表未選中,1代表選中,它返回一個bool數組
        indicatorCG.getSelectedFlags(SelectedFlags);
  
        //當選中Show Indicator時,會有一個進度條來顯示Alert存在的時間
        if(SelectedFlags[0]){
          Gauge indicator = createIndicator(timeouts[timeoutIndex]);
          alert.setIndicator(indicator);
        }
        display.setCurrent(alert);
      }
      else if(c == CMD_EXIT){
        destroyApp(false);
        notifyDestroyed();
      }
    }

  }
  
  private Gauge createIndicator(int maxValue){
    /**
     * Implements a graphical display, such as a bar graph, of an integer value.
     * The Gauge contains a current value that lies between zero and the maximum value, inclusive.
     * The application can control the current value and maximum value.
     * The range of values specified by the application may be larger than the number of distinct visual states possible on the device, 
     * so more than one value may have the same visual representation. 
     * Gauge(String label, boolean interactive, int maxValue, int initialValue)
     */
    if(maxValue == Alert.FOREVER){
      return new Gauge(null, false, Gauge.INDEFINITE, Gauge.CONTINUOUS_RUNNING);
    }
    final int max = maxValue / SECOND;
    final Gauge indicator = new Gauge(null, false, max, 0);
    //開啟線程,每秒鐘重畫一次,構造進度條的效果
    if(maxValue != Gauge.INDEFINITE){
      new Thread(){
        public void run(){
          int value = 0;
          while(value < max){
            indicator.setValue(value);
            ++ value;
            try {
              Thread.sleep(1000);
            } catch (Exception e) {
            }
          }
        }
      }.start();
    }
    return indicator;
  }
  
  public void pauseApp() {
  }
  
  public void destroyApp(boolean unconditional) {
  }
}

未選中Show Indicator時的效果圖:

選中Show Indicator時的效果圖:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved