国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

如何實現j2me對話框

2019-11-18 16:09:46
字體:
來源:轉載
供稿:網友

 

內容提要:


在手機這么小的屏幕上開發應用,難點之一就是頻繁的屏幕切換。盡管midp2.0的UI部分已經很豐富了,但這些UI部件都是基于事件回調的。這在處理大量的、簡單的問答式交互時顯得力不從心。
本文實現了一個阻塞當前線程的對話框,簡要地說,你可以使用諸如win32API中dialog函數那樣的方式來實現對話框并阻塞等待返回值,然后根據返回值進行不同的處理。聽起來很誘人吧。


正文:

問題何在?


首先回顧一下midp UI的事件處理機制。有兩個要點:
1)首先UI部分由系統的一個線程負責維護。也就是說不能阻塞系統的事件處理方法。
2)事件處理使用的是一種回調機制。首先UI部件使用諸如setCommandListener之類的方法為自己注冊一個回調接口(其中的回調方法由用戶實現);等到觸發了相應事件就調用這個注冊好的接口的回調方法。

以下是一個實現了CommandListener的類的代碼片斷:
Form f=new Form("Hello world");
f.addCommand(exit);
f.setCommandListener(this);
可以想象基于事件回調的處理方式,在處理大量的、簡單的問答式交互時顯得力不從心。你不得不為每一個僅僅是詢問要不要繼續的對話框而實現一個又一個類,或者處理一個復雜的回調函數。如果選擇后者,那么在一個又一個的if-else中處理不同邏輯事件的代碼片斷一定會煩死你。

較好的做法


這時候我們不免懷念一下win32 Api中對話框函數的處理方式:
int choose=Dialog(title,type……);
if(choose==OK){……}
else if(choose==Cancel){……}
這樣處理將會阻塞當前線程,等待返回值,然后根據返回值進行處理。這樣做很cool的原因就是在一個邏輯性很完整的任務中,你可以一次性在一個回調方法中完成所有邏輯,而不必為了問詢簡單的YES/NO問題而在不同的類中間跳來跳去。


如何在MIDP下實現


我們遇到的第一個問題來自于我們的方法必須要阻塞當前線程等待返回值。也就是說,這個對話框不能在UI的回調中直接運行,比如commandAction中。解決辦法是將所有的事件處理都放到一個線程類中處理。(這是一點額外的負擔,但不可避免)。還好這個工作量不大,要想實現兩個對象之間的通信也不難。
第二個問題是如何阻塞當前的線程,我們祭出java線程的三板斧之wait()/notifyAll()。我們可以指定一個信號量(初值false),當其為false時阻塞當前線程,在得到用戶通知后將信號量改為true,并喚醒線程。
下面看一下主要思路:

如何實現j2me對話框(圖一)


看一下代碼:

 

Dialog.java

/*
 *為j2me提供阻塞的dialog調用方法。
 *但前提是,如果要在UI的相應線程中運行(比如commonAction),
 *則需首先打開一個新的線程中使用,因為UI線程是不可以阻塞的。
 *這個版本雖然包含在coreUI2.0中,但midp1.0也可以用。seimens s57通過測試。
 *
 */
package bean;

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;

/**
 * @author Favo
*/
public class Dialog {//主類
 PRivate boolean blockFlag = false;
 public static int YES=0;
 public static int NO=1;
 private int returnValue;
 private Display display;
 
 public Dialog(Display display){
  this.display=display;
 }
 
 public void setReturnValue(int i){//設置返回值
  returnValue=i;
 }

 synchronized boolean getBlockFlag() {//取得信號量
  return blockFlag;
 }

 synchronized void setBlockFlag(boolean flag) {//設置信號量
  blockFlag = flag;
 }
 
 public int show(String title,String content,String yes,String no){
  setBlockFlag(false);
  Form f=new DialogForm(this,title,content,yes,no);
  display.setCurrent(f);//顯示UI
  try {
   while(getBlockFlag()==false){//如果用戶沒選擇阻塞
    synchronized (this) {
     wait();
    }
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
   System.out.println("InterruptedException in Dialog.show");
  }
  return returnValue;//返回
 }
 
 
 public void wakeup(){
  synchronized (this) {//喚醒阻塞的線程
   notifyAll();
  }
  
 }
}


class DialogForm extends Form implements CommandListener{//UI部分
 Command yesCMD;
 Command noCMD;
 Dialog dialog;
 
 public DialogForm(Dialog dialog,String title,String content,String yes,String no) {
  super(title);
  this.dialog=dialog;
  append(content);
  yesCMD=new Command(yes,Command.OK,1);
  noCMD=new Command(no,Command.CANCEL,1);
  addCommand(yesCMD);
  addCommand(noCMD);
  setCommandListener(this);
 }

 public void commandAction(Command c, Displayable d) {
  if(c==yesCMD){
   dialog.setBlockFlag(true);
   dialog.setReturnValue(Dialog.YES);
   dialog.wakeup();
  }else if(c==noCMD){
   dialog.setBlockFlag(true);
   dialog.setReturnValue(Dialog.NO);
   dialog.wakeup();
  }
 }
 
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


如何使用


我編寫了一個Test。當用戶按下show按鈕時,開啟對話框,并將用戶的選擇打印出來。

DialogTest.java
package bean;

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.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


public class DialogTest extends MIDlet implements CommandListener {
 Display display;

 Form f = new Form("DialogTest");

 Command showCMD = new Command("show", Command.ITEM, 1);

 public DialogTest() {
  super();
  display = Display.getDisplay(this);
  f.addCommand(showCMD);
  f.setCommandListener(this);
  display.setCurrent(f);
 }

 protected void startApp() throws MIDletStateChangeException {
 }

 protected void pauseApp() {
 }

 protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
 }


 public void commandAction(Command c, Displayable d) {
  new work1(c).start();
 }

 class work1 extends Thread {
  Command c;
  
  public work1(Command c) {
   super();
   this.c = c;
  }
  public void run() {
   super.run();
   if(c==showCMD){
    int choose=new Dialog(display).show("Choose","Do you like your Operation?","yes","no");
    if(choose==Dialog.YES){
     f.append("Yes,user like/n");
    }else if(choose==Dialog.NO){
     f.append("No,user like/n");
    }
    display.setCurrent(f);
   }
  }
 }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

屏幕快照

如何實現j2me對話框(圖二)
按下show
如何實現j2me對話框(圖三)
用戶多次選擇的結果
如何實現j2me對話框(圖四)

 

 

 

 

 

(出處:http://www.survivalescaperooms.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁陵县| 竹山县| 咸丰县| 金乡县| 合作市| 太仆寺旗| 沙雅县| 远安县| 鸡西市| 绵竹市| 通州市| 金湖县| 新丰县| 谷城县| 读书| 博罗县| 通海县| 弥勒县| 泰宁县| 江孜县| 揭阳市| 玛曲县| 八宿县| 安泽县| 桑日县| 咸宁市| 土默特左旗| 鹤山市| 武强县| 廉江市| 合江县| 思南县| 怀化市| 钟山县| 象山县| 永康市| 措勤县| 海口市| 竹北市| 莫力| 六枝特区|