黑莓开发学习(入门教程)标准界面的HelloWorld程序

04-标准界面的HelloWorld程序

摘要 :看到Hello World显示在BB屏幕,是不是有些激动?但这个程序最多只能算是测试开发环境是否正常可用的实验代码,没有友好的界面,没有良好的交互。一个像样的程 序只要要有个彩色的窗口、有用户输入、有按钮、有菜单吧?完善一下标准的HelloWorld程序。
作者:小叶 xiaoye.org
可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息
标准的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);
         }
     }
       
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘要:基本上将常用的软件可以在BB用的替代品都找到了,还是感觉自己想要的一些功能没有能实现,于是有了自己写一个程序的想法。初步看了一些开发的文章,BB的程序都是基于Java的,Java以前用过。有好的工具,充分的文档,写一个程序也许不是太大的困难。网上转转,才发现讲BB应用的资料多,探讨BB软件开发的少,好的内容基本都是E文的。将自己边学边用的过程记录下来,遇到的问题是怎么解决的,也许可以让更多的同学少走弯路,不要被一个无法编译通过的“HelloWorld程序就沮丧得失去了热情。 购入BB8820有一段时间了,的确被其易用、高效所折服。以前也用过Nokia S60 S90的机器,用过基于Windows Mobile的iPaq,都未曾有这样的感觉。基本上将常用的软件可以在BB用的替代品都找到了,还是感觉自己想要的一些功能没有能实现,于是有了自己写一个程序的想法。 初步看了一些开发的文章,BB的程序都是基于Java的,Java以前用过。有好的工具,充分的文档,写一个程序也许不是太大的困难。网上转转,才发现讲BB应用的资料多,探讨BB软件开发的少,好的内容基本都是E文的。真正着手开始边学边用,才发现搭建一个流程的开发环境也不是易事。 我不是专业的Coder更算不上程序员,用过从C、PHP、Delphi、Powerbuilder、VB.Net、T-SQL等多个语言,在Unix、Windows、WM下都开发程序。感觉就是语言总是相通的,熟悉一门语言,学习另一门语言就是规则的迁移而已。还有为学语言而学习,总是会半途而废,只有是为了解决工作的中的问题、找一个应手的工具,在遇到问题解决问题的过程中不断提高,对语言的理解和应用水平也就突飞猛进了。从工作实习时第一个用Foxpro写的代理行业务记录和统计程序开始,大大小小也写了很多软件或称为程序吧。可惜由于都是与工作相关,无法分享出来,但一个个岗位过来看到同事们能用我写的东东提高效率解决问题,也是挺开心的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值