本文转载自:http://hi.baidu.com/netis/blog/item/5e4c2b2a9a5b0591033bf6b8.html
作者:小叶 xiaoye.org
可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息
摘要:看到Hello World显示在BB屏幕,是不是有些激动?但这个程序最多只能算是测试开发环境是否正常可用的实验代码,没有友好的界面,没有良好的交互。一个像样的程序只要要有个彩色的窗口、有用户输入、有按钮、有菜单吧?完善一下标准的HelloWorld程序。
标准的HelloWorld程序也太简陋了,有了太多的想法要实现:
▲能否设置一个漂亮的程序图标,而不是黑乎乎的命令行窗口?
▲能否设置一个程序标题?
▲能否放一个按钮点击后提示欢迎信息?
▲能否自定义一个菜单?
04.1-思维导图

04.1-为程序添加图标
在JDE的工作区点击FirstDemo,
右键->properties....。在属性设置窗口点击Add添加一个图像文件,支持.png、.gif、.jpg。
图像文件名必须是英文名,否则编译的时候会提示“I/O Error: invalid UTF-8 encoding”

程序编译运行后图标就会显示成一个笑脸:
04.2-设置程序标题
通过如下代码即可实现:
//设置程序的标题
LabelField title = new LabelField( "Hello World",Field.FIELD_HCENTER);
this.setTitle(title);
LabelField title = new LabelField( "Hello World",Field.FIELD_HCENTER);
this.setTitle(title);
04.3-设置程序主界面的背景
要实现这个功能需要分两步,
第一步:从容器控件VerticalFieldManager基础一个新布局控件BackgroundManager,增加一个背景颜色的属性,并通过重载VerticalFieldManager的paintBackground来实现自定义设置的显示。
//定义一个窗口布局控件 主要是为了能改变窗口背景颜色
public static class BackgroundManager extends VerticalFieldManager
{
private int bgColor = Color.NAVY;
public BackgroundManager()
{
super( USE_ALL_HEIGHT | NO_VERTICAL_SCROLL | NO_VERTICAL_SCROLLBAR );
bgColor = Color.NAVY;
}
public BackgroundManager( int bgcolor)
{
super( USE_ALL_HEIGHT | NO_VERTICAL_SCROLL | NO_VERTICAL_SCROLLBAR );
bgColor = bgcolor;
}
//重新设置程序背景色彩
protected void paintBackground(Graphics g)
{
g.setBackgroundColor(bgColor);
g.clear();
super.paint(g);
}
}
public static class BackgroundManager extends VerticalFieldManager
{
private int bgColor = Color.NAVY;
public BackgroundManager()
{
super( USE_ALL_HEIGHT | NO_VERTICAL_SCROLL | NO_VERTICAL_SCROLLBAR );
bgColor = Color.NAVY;
}
public BackgroundManager( int bgcolor)
{
super( USE_ALL_HEIGHT | NO_VERTICAL_SCROLL | NO_VERTICAL_SCROLLBAR );
bgColor = bgcolor;
}
//重新设置程序背景色彩
protected void paintBackground(Graphics g)
{
g.setBackgroundColor(bgColor);
g.clear();
super.paint(g);
}
}
第二步:创建一个背景容器BackgroundManager命名为mgr,并将其他控件放置在这个背景容器上,最后将背景容器放置到程序主窗口HelloWorldScreen上。
//背景容器实例
BackgroundManager mgr = new BackgroundManager(Color.MEDIUMAQUAMARINE);
//添加一个输入域
edtName = new BasicEditField( "输入您的姓名: ", "小叶", 20,Field.FIELD_LEFT );
mgr.add(edtName);
//添加一个按钮 点击后根据输入的内容提示
btnShow = new ButtonField( "显示欢迎信息",Field.FIELD_HCENTER | ButtonField.CONSUME_CLICK );
btnShow.setChangeListener( this);
mgr.add(btnShow);
this.add(mgr);
BackgroundManager mgr = new BackgroundManager(Color.MEDIUMAQUAMARINE);
//添加一个输入域
edtName = new BasicEditField( "输入您的姓名: ", "小叶", 20,Field.FIELD_LEFT );
mgr.add(edtName);
//添加一个按钮 点击后根据输入的内容提示
btnShow = new ButtonField( "显示欢迎信息",Field.FIELD_HCENTER | ButtonField.CONSUME_CLICK );
btnShow.setChangeListener( this);
mgr.add(btnShow);
this.add(mgr);
下图为实施上两步后的效果:
04.4-增加一个用户输入域
通过如下代码即可实现:
为了后续点击按钮可以取得录入的内容,在构造函数前定义一个输入域控件。
//定义类的元素
private BasicEditField edtName = null; //姓名输入域
private BasicEditField edtName = null; //姓名输入域
创建和添加数据域。
//添加一个输入域
edtName = new BasicEditField( "输入您的姓名: ", "小叶", 20,Field.FIELD_LEFT );
mgr.add(edtName);
edtName = new BasicEditField( "输入您的姓名: ", "小叶", 20,Field.FIELD_LEFT );
mgr.add(edtName);
效果见上图。
04.5-添加一个按钮
//添加一个按钮 点击后根据输入的内容提示
btnShow = new ButtonField( "显示欢迎信息",Field.FIELD_HCENTER | ButtonField.CONSUME_CLICK );
btnShow.setChangeListener( this);
mgr.add(btnShow);
this.add(mgr);
btnShow = new ButtonField( "显示欢迎信息",Field.FIELD_HCENTER | ButtonField.CONSUME_CLICK );
btnShow.setChangeListener( this);
mgr.add(btnShow);
this.add(mgr);
对按钮事件接口也需要继承后定义下接口处理
//处理按钮事件
public void fieldChanged(Field field, int ctx)
{
if (field == btnShow) {
Dialog.alert( "欢迎您-" +edtName.getText());
}
};
public void fieldChanged(Field field, int ctx)
{
if (field == btnShow) {
Dialog.alert( "欢迎您-" +edtName.getText());
}
};
程序运行后,点击按钮,按钮就会根据录入的内容显示欢迎信息,如下图。
04.6-自定义菜单
首先,创建需要显示的子菜单,为区分与系统默认菜单项,菜单显示名称以*开始。
//定义显示信息菜单项目
public MenuItem showItem = new MenuItem( "*显示欢迎信息", 160, 10 )
{
public void run()
{
Dialog.alert( "欢迎您-" +edtName.getText());
}
};
//定义显示关闭菜单项目
public MenuItem closeItem = new MenuItem( "*退出", 170, 10 )
{
public void run()
{
onClose();
}
};
public MenuItem showItem = new MenuItem( "*显示欢迎信息", 160, 10 )
{
public void run()
{
Dialog.alert( "欢迎您-" +edtName.getText());
}
};
//定义显示关闭菜单项目
public MenuItem closeItem = new MenuItem( "*退出", 170, 10 )
{
public void run()
{
onClose();
}
};
其次,重载菜单生成函数,使得自定义菜单添加到系统默认菜单中。
//重载makeMenu 添加自定义的菜单
protected void makeMenu(Menu menu, int instance)
{
menu.add(showItem);
menu.add(closeItem);
}
protected void makeMenu(Menu menu, int instance)
{
menu.add(showItem);
menu.add(closeItem);
}
菜单显示效果如下:

点击菜单后显示对话框:
04.7-完整代码
为了代码的维护和可读性,将定义窗口类的代码单独成一个文件HelloWorldScreen.java。创建新程序文件的方法见第三部分的“03.4-建立程序文件”。
主程序HelloWorld.java
/*
HelloWorld.java
主程序
作者:小叶 xiaoye.org
发布:http://hi.baidu.com/netis
可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息
*/
package src;
//导入库
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.container.MainScreen;
public class HelloWorld extends UiApplication {
//程序的构造函数
public HelloWorld() {
HelloWorldScreen screen = new HelloWorldScreen();
pushScreen(screen);
}
//程序的入口函数 java程序运行都需要这个 否则会提示找不到main的提示
public static void main(String[] args) {
HelloWorld app = new HelloWorld();
app.enterEventDispatcher();
}
}
HelloWorld.java
主程序
作者:小叶 xiaoye.org
发布:http://hi.baidu.com/netis
可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息
*/
package src;
//导入库
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.container.MainScreen;
public class HelloWorld extends UiApplication {
//程序的构造函数
public HelloWorld() {
HelloWorldScreen screen = new HelloWorldScreen();
pushScreen(screen);
}
//程序的入口函数 java程序运行都需要这个 否则会提示找不到main的提示
public static void main(String[] args) {
HelloWorld app = new HelloWorld();
app.enterEventDispatcher();
}
}
窗口类HelloWorldScreen.java
/*
HelloWorldScreen.java
窗口类 实现了程序的用户界面
作者:小叶 xiaoye.org
发布:http://hi.baidu.com/netis
可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息
*/
package src;
//导入库
import net.rim.device.api.ui. *;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component. *;
import net.rim.device.api.ui.container. *;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.system.Display;
//窗口类
final class HelloWorldScreen extends MainScreen implements FieldChangeListener {
//定义类的元素
private BasicEditField edtName = null; //姓名输入域
private ButtonField btnShow = null; //显示按钮
//构造函数
public HelloWorldScreen() {
//父类的事件 显示默认的上下文菜单
super(DEFAULT_MENU | DEFAULT_CLOSE);
//设置程序的标题
LabelField title = new LabelField( "Hello World",Field.FIELD_HCENTER);
this.setTitle(title);
//背景容器实例
BackgroundManager mgr = new BackgroundManager(Color.MEDIUMAQUAMARINE);
//添加一个输入域
edtName = new BasicEditField( "输入您的姓名: ", "小叶", 20,Field.FIELD_LEFT );
mgr.add(edtName);
//添加一个按钮 点击后根据输入的内容提示
btnShow = new ButtonField( "显示欢迎信息",Field.FIELD_HCENTER | ButtonField.CONSUME_CLICK );
btnShow.setChangeListener( this);
mgr.add(btnShow);
this.add(mgr);
}
//定义显示信息菜单项目
public MenuItem showItem = new MenuItem( "*显示欢迎信息", 160, 10 )
{
public void run()
{
Dialog.alert( "欢迎您-" +edtName.getText());
}
};
//定义显示关闭菜单项目
public MenuItem closeItem = new MenuItem( "*退出", 170, 10 )
{
public void run()
{
onClose();
}
};
//重载makeMenu 添加自定义的菜单
protected void makeMenu(Menu menu, int instance)
{
menu.add(showItem);
menu.add(closeItem);
}
//处理按钮事件
public void fieldChanged(Field field, int ctx)
{
if (field == btnShow) {
Dialog.alert( "欢迎您-" +edtName.getText());
}
};
//重载onClose, 退出时提示
public boolean onClose()
{
if ( Dialog.ask(Dialog.D_YES_NO, "确定退出吗?") == Dialog.YES )
{
System.exit( 0);
return true;
}
return false;
}
//定义一个窗口布局控件 主要是为了能改变窗口背景颜色
public static class BackgroundManager extends VerticalFieldManager
{
private int bgColor = Color.NAVY;
public BackgroundManager()
{
super( USE_ALL_HEIGHT | NO_VERTICAL_SCROLL | NO_VERTICAL_SCROLLBAR );
bgColor = Color.NAVY;
}
public BackgroundManager( int bgcolor)
{
super( USE_ALL_HEIGHT | NO_VERTICAL_SCROLL | NO_VERTICAL_SCROLLBAR );
bgColor = bgcolor;
}
//重新设置程序背景色彩
protected void paintBackground(Graphics g)
{
g.setBackgroundColor(bgColor);
g.clear();
super.paint(g);
}
}
}
HelloWorldScreen.java
窗口类 实现了程序的用户界面
作者:小叶 xiaoye.org
发布:http://hi.baidu.com/netis
可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息
*/
package src;
//导入库
import net.rim.device.api.ui. *;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component. *;
import net.rim.device.api.ui.container. *;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.system.Display;
//窗口类
final class HelloWorldScreen extends MainScreen implements FieldChangeListener {
//定义类的元素
private BasicEditField edtName = null; //姓名输入域
private ButtonField btnShow = null; //显示按钮
//构造函数
public HelloWorldScreen() {
//父类的事件 显示默认的上下文菜单
super(DEFAULT_MENU | DEFAULT_CLOSE);
//设置程序的标题
LabelField title = new LabelField( "Hello World",Field.FIELD_HCENTER);
this.setTitle(title);
//背景容器实例
BackgroundManager mgr = new BackgroundManager(Color.MEDIUMAQUAMARINE);
//添加一个输入域
edtName = new BasicEditField( "输入您的姓名: ", "小叶", 20,Field.FIELD_LEFT );
mgr.add(edtName);
//添加一个按钮 点击后根据输入的内容提示
btnShow = new ButtonField( "显示欢迎信息",Field.FIELD_HCENTER | ButtonField.CONSUME_CLICK );
btnShow.setChangeListener( this);
mgr.add(btnShow);
this.add(mgr);
}
//定义显示信息菜单项目
public MenuItem showItem = new MenuItem( "*显示欢迎信息", 160, 10 )
{
public void run()
{
Dialog.alert( "欢迎您-" +edtName.getText());
}
};
//定义显示关闭菜单项目
public MenuItem closeItem = new MenuItem( "*退出", 170, 10 )
{
public void run()
{
onClose();
}
};
//重载makeMenu 添加自定义的菜单
protected void makeMenu(Menu menu, int instance)
{
menu.add(showItem);
menu.add(closeItem);
}
//处理按钮事件
public void fieldChanged(Field field, int ctx)
{
if (field == btnShow) {
Dialog.alert( "欢迎您-" +edtName.getText());
}
};
//重载onClose, 退出时提示
public boolean onClose()
{
if ( Dialog.ask(Dialog.D_YES_NO, "确定退出吗?") == Dialog.YES )
{
System.exit( 0);
return true;
}
return false;
}
//定义一个窗口布局控件 主要是为了能改变窗口背景颜色
public static class BackgroundManager extends VerticalFieldManager
{
private int bgColor = Color.NAVY;
public BackgroundManager()
{
super( USE_ALL_HEIGHT | NO_VERTICAL_SCROLL | NO_VERTICAL_SCROLLBAR );
bgColor = Color.NAVY;
}
public BackgroundManager( int bgcolor)
{
super( USE_ALL_HEIGHT | NO_VERTICAL_SCROLL | NO_VERTICAL_SCROLLBAR );
bgColor = bgcolor;
}
//重新设置程序背景色彩
protected void paintBackground(Graphics g)
{
g.setBackgroundColor(bgColor);
g.clear();
super.paint(g);
}
}
}
本文详细介绍如何逐步完善一个基本的HelloWorld程序,包括设置程序图标、标题、背景色、添加输入域、按钮及自定义菜单等功能。
691

被折叠的 条评论
为什么被折叠?



