`

J2me实现对话框选择功能(如同应用软件时常弹出的提示框)

    博客分类:
  • J2me
阅读更多

内容提要:
在手机这么小的屏幕上开发使用,难点之一就是频繁的屏幕切换。尽管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,并唤醒线程。

演示源码:

package dialog;

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);
			}
		}
	}
}

 

package dialog;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;

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();
		}
	}

}

 

package dialog;

/*
 *为j2me提供阻塞的dialog调用要领。
 *但前提是,如果要在UI的相应线程中运行(比如commonAction),
 *则需首先打开一个新的线程中运用,因为UI线程是不可以阻塞的。
 *这个版本虽然包含在coreUI2.0中,但midp1.0也可以用。seimens s57通过测试。
 *
 */

import javax.microedition.lcdui.Display;
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();
		}

	}
}

 

分享到:
评论

相关推荐

    j2me开发框架介绍

    J4ME 是一个 J2ME 应用程序开发库,目标是快速构建专业的 J2ME 应用程序。它提供了一个 UI 框架、日志框架、RMS 框架、蓝牙 GPS 框架等多个功能。 3. MWT(Micro Window Toolkit) MWT 是一个用于开发 J2ME 用户...

    j2me 实现打电话功能

    在移动设备领域,Java 2 Micro Edition(J2ME)是一种广泛用于开发移动应用的平台,尤其在功能手机时代占据重要地位。标题“j2me 实现打电话功能”表明我们将探讨如何利用J2ME技术来实现手机的基本通话功能。描述中...

    J2ME 画布实现中文输入

    在Java Micro Edition (J2ME) 平台上开发移动应用时,由于资源限制,往往需要进行一些巧妙的设计来实现特定功能。"J2ME 画布实现中文输入"这一主题,就是针对在J2ME环境下如何创建一个自定义的中文输入系统进行探讨...

    J2ME实现短信功能

    它提供了丰富的API来构建功能丰富的应用程序,其中包括实现通信功能,如短信服务。本篇文章将深入探讨如何利用J2ME来实现短信功能,包括客户端和服务器端的实现细节。 首先,我们要理解J2ME中的SMS(Short Message ...

    J2ME实现画图程序

    在这个J2ME实现的画图程序中,我们主要关注的是如何在移动设备上利用Java Micro Edition(J2ME)框架创建一个简单的画图应用。J2ME是Java平台的一个子集,专门用于嵌入式设备,如手机和PDA。在这个程序中,核心功能...

    用J2ME实现简单电子邮件发送功能

    用J2ME实现简单电子邮件发送功能 用J2ME实现简单电子邮件发送功能

    基于J2ME的移动支付系统终端应用的实现

    基于J2ME的移动支付系统终端应用的实现

    fallME 一个J2ME的开发框架

    2. **项目创建**:使用fallME提供的模板或者从头开始创建一个新的J2ME项目,根据需求选择合适的组件和功能。 3. **编码实现**:基于fallME的API进行编码,利用其提供的工具和组件构建应用的界面和逻辑。 4. **编译...

    J2ME 实现的 UrlEncode编码

    J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码 J2ME 实现的 UrlEncode编码

    J2ME实现范例

    通过这个“J2ME实现范例”,你可以亲手实践这些知识点,逐步掌握J2ME开发技能,为未来开发更多功能丰富的移动应用打下坚实基础。在每个实践中,你将学会如何结合理论与实际,解决实际问题,提升你的编程能力。

    j2me实现视频播放

    在移动设备领域,Java 2 Micro Edition(J2ME)是一种广泛使用的平台,用于开发运行在功能手机和早期智能手机上的应用程序。"j2me实现视频播放"这一主题涉及到利用J2ME技术实现在这些设备上播放视频的功能。下面将...

    j2me实现手机QQ源代码

    手机QQ作为一款流行的即时通讯软件,它的实现涉及到网络通信、数据加密、用户界面设计等多个关键领域,通过分析其源代码,我们可以深入理解J2ME在实际应用中的具体实践。 1. **网络通信**:在J2ME中,网络通信主要...

    j2me 实现拼图 一共三个类

    在本文中,我们将深入探讨如何使用Java 2 Micro Edition (J2ME) 实现一个拼图游戏。这个项目由三个核心类组成,旨在为移动设备提供一个简单的拼图游戏体验。J2ME 是一种轻量级的Java平台,主要用于开发在嵌入式设备...

    用J2ME实现播放一段视频

    在Java ME(J2ME)平台上开发移动应用时,实现视频播放功能可能是一个挑战,因为它的资源和性能限制相比桌面或现代移动平台更为有限。不过,通过合理的编程和利用特定库,这一目标是可以达成的。以下是你需要知道的...

    j2me实现mvc的框架源码

    标签"j2me实现mvc的框架源码"与标题一致,提示我们关注的重点在于如何在J2ME环境中构建并理解一个MVC框架的源代码。 **压缩包子文件的文件名称列表** 这里只有一个文件名"kb ox1.03",这可能是框架的特定版本或者...

    myeclipse搭建j2me环境

    5. **创建J2ME项目**:在MyEclipse中,选择"File" -> "New" -> "Other",在弹出的对话框中,展开"EclipseME",选择"J2ME Project",点击"Next",输入项目名,选择相应的设备配置,如CLDC/MIDP,然后"Finish"。...

    j2me实现手机电话本功能

    使用j2me平台编写的电话本小程序 实现增删改查功能

    J2ME开发 J2ME开发 J2ME开发

    2. **MIDP (Mobile Information Device Profile)**:MIDP是J2ME中最常见的框架,用于开发移动应用程序,包括用户界面组件和网络通信功能。 3. **CLDC (Connected Limited Device Configuration)**:这是J2ME的基础...

    J2ME实现俄罗斯方块

    J2ME是一种Java平台,主要用于移动设备和嵌入式系统,它提供了一套轻量级的API,使得开发者能够在资源有限的设备上创建功能丰富的应用程序。在J2ME中,我们通常会使用MIDP(Mobile Information Device Profile)和...

Global site tag (gtag.js) - Google Analytics