【转载】黑莓开发学习(入门教程)04-标准界面的HelloWorld程序

来源:互联网 发布:天津福禄克数据测试 编辑:程序博客网 时间:2024/05/16 08:01

本文转载自:http://hi.baidu.com/netis/blog/item/5e4c2b2a9a5b0591033bf6b8.html

作者:小叶 xiaoye.org
发布:http://hi.baidu.com/netis
可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息
摘要:看到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);

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);
     }
}
第二步:创建一个背景容器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);
下图为实施上两步后的效果:

04.4-增加一个用户输入域

通过如下代码即可实现:
为了后续点击按钮可以取得录入的内容,在构造函数前定义一个输入域控件。
//定义类的元素
private BasicEditField edtName = null;  //姓名输入域
创建和添加数据域。
//添加一个输入域
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);
对按钮事件接口也需要继承后定义下接口处理
//处理按钮事件
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();
     }
};
其次,重载菜单生成函数,使得自定义菜单添加到系统默认菜单中。
//重载makeMenu 添加自定义的菜单
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();   
     }
}

窗口类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);
         }
     }
       
}
原创粉丝点击