HardBirch

J2ME GUI实战之二 —— LWUIT实现手机九宫图

时间:08-09-13 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:6 点击: 2,675 次


本文的源代码,已放到 http://download.csdn.net/user/hellogv 供大家下载!

首先,想让大家看看九宫图实现之后的界面:

本文所用的代码,是来自LWUIT所提供的Sample例子,但是对例子做出以下修改:
1.设计自主的res资源文件
2.把builde.xml里面的<target name="post-compile"> 。。。。。</target> 删除
3.把所用的res文件放到一个名为res的文件夹,并与源代码放在一起
4.把ResourceBuilder.jar也删除,util文件夹里的ResourceBuilder.jar绝对不能删,是用于设计res文件

针对以上4点,说明一下为什么这么做:
原Sample例子的res文件,是使用util文件夹里的ResourceEdit.exe设计,而且还在builde.xml中使用ResourceBuilder.jar再重新生成一次res文件并与源文件组合,这显然有点冗余,因为直接用ResourceEdit.exe设计的res文件放到源文件目录里即可。也许Sample作者直接使用ANT编译或者是其他IDE要求,本文所用的IDE为netbeans

OK,接下来就是源代码修改了,Sample源代码可是写得很长很长,要看也得花不少时间,但是,我保证大家看完后一定领略到JAVA大牛的编程功力之深!!!为了方便以后使用,所以我把Sample中实现九宫图和一些小操作的代码保留,其他都去掉了,请JAVA大牛切勿见笑哈。
以下给出关键代码:

  1. /*
  2.  * Copyright ? 2008 Sun Microsystems, Inc. All rights reserved.
  3.  * Use is subject to license terms.
  4.  *
  5.  */
  6. package com.sun.lwuit.uidemo;
  7. import com.sun.lwuit.Button;
  8. import com.sun.lwuit.animations.CommonTransitions;
  9. import com.sun.lwuit.Command;
  10. import com.sun.lwuit.Component;
  11. import com.sun.lwuit.Dialog;
  12. import com.sun.lwuit.Display;
  13. import com.sun.lwuit.Form;
  14. import com.sun.lwuit.Image;
  15. import com.sun.lwuit.Label;
  16. import com.sun.lwuit.animations.Transition;
  17. import com.sun.lwuit.animations.Transition3D;
  18. import com.sun.lwuit.events.ActionEvent;
  19. import com.sun.lwuit.events.ActionListener;
  20. import com.sun.lwuit.events.FocusListener;
  21. import com.sun.lwuit.layouts.GridLayout;
  22. import com.sun.lwuit.plaf.Style;
  23. import com.sun.lwuit.plaf.UIManager;
  24. import com.sun.lwuit.util.Resources;
  25. public class UIDemoMIDlet extends javax.microedition.midlet.MIDlet implements ActionListener {
  26.     private static final Command exitCommand = new Command("Exit"1);
  27.     private String[] btn_name = new String[]{//九宫图的名称,同时也是图标的名称
  28.     "Image 1","Image 2","Image 3","Image 4","Image 5","Image 6","Image 7",
  29.     "Image 8","Image 9"
  30.     };
  31.     private static Transition componentTransitions;
  32.     private static Form mainMenu;//主窗体
  33.     private int cols;
  34.     private int elementWidth;
  35.     protected void startApp() {
  36.         try {
  37.             Display.init(this);
  38.             Resources r = Resources.open("/res/resources.res");//读取资源文件
  39.             setMainForm(r);
  40.         } catch (Throwable ex) {
  41.             ex.printStackTrace();
  42.             Dialog.show("Exception", ex.getMessage(), "OK"null);//hellogv最爱的提示框弹出方式
  43.         }
  44.     }
  45.     protected void pauseApp() {
  46.     }
  47.     protected void destroyApp(boolean arg0) {
  48.     }
  49.     public static void setMenuTransition(Transition in, Transition out) {
  50.         mainMenu.setMenuTransitions(in, out);
  51.         UIManager.getInstance().getLookAndFeel().setDefaultMenuTransitionIn(in);
  52.         UIManager.getInstance().getLookAndFeel().setDefaultMenuTransitionOut(out);
  53.     }
  54.     public static void setComponentTransition(Transition t) {
  55.         componentTransitions = t;
  56.         mainMenu.setSmoothScrolling(false);
  57.     }
  58.     public static Transition getComponentTransition() {
  59.         return componentTransitions;
  60.     }
  61.     public static void backToMainMenu(){
  62.                 mainMenu.refreshTheme();
  63.                 mainMenu.show();
  64.                 // for series 40 devices
  65.                 System.gc();
  66.                 System.gc();
  67.     }
  68.     private void setMainForm(Resources r) {
  69.         //设置主题
  70.         UIManager.getInstance().setThemeProps(r.getTheme("businessTheme"));
  71.         mainMenu = new MainScreenForm("LWUIT Demo") ;
  72.         int width = Display.getInstance().getDisplayWidth(); //取得全屏的宽度
  73.         elementWidth = 0;
  74.         //效果,可以实现类似IPhone、S1智能机的Touch Flo的动态窗体切换效果!**********************
  75.         mainMenu.setTransitionOutAnimator(CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL, false500));
  76.         mainMenu.setTransitionInAnimator(CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL, true500));
  77.         UIDemoMIDlet.setComponentTransition(Transition3D.createCube(600false));
  78.         //***************************************************************************************************************
  79.         Image[] selectedImages = new Image[btn_name.length];//按钮被选中时的图片
  80.         Image[] unselectedImages = new Image[btn_name.length];//按钮未被选中的图片
  81.         for (int i = 0; i < btn_name.length; i++) {
  82.             //---------读取选中时的图片
  83.             selectedImages[i] = r.getImage(btn_name[i]);
  84.             //--------读取未被选中的图片
  85.             unselectedImages[i] = r.getImage(btn_name[i]);
  86.             final Button button = new Button(btn_name[i], unselectedImages[i])
  87.             {
  88.                 public Image getPressedIcon() {
  89.                     Image i = getIcon();
  90.                     return i.scaled((int) (i.getWidth() * 0.8), (int) (i.getHeight() * 0.8));
  91.                 }
  92.             };
  93.             button.setRolloverIcon(selectedImages[i]);
  94.             Style s = button.getStyle();
  95.             s.setBorder(null);
  96.             s.setBgTransparency(0);
  97.             s.setBgSelectionColor(0xffffff);
  98.             button.setAlignment(Label.CENTER);
  99.             button.setTextPosition(Label.BOTTOM);
  100.             mainMenu.addComponent(button);
  101.             button.addActionListener(this);
  102.             //按钮焦点处理,用于实现按钮特效
  103.             button.addFocusListener(new FocusListener() {
  104.                 public void focusGained(Component cmp) {//按钮取得焦点时的特效
  105.                     if (componentTransitions != null) {
  106.                         mainMenu.replace(button, button, componentTransitions);
  107.                     }
  108.                 }
  109.                 public void focusLost(Component cmp) {}//按钮失去焦点时的特效
  110.             });
  111.             elementWidth = Math.max(button.getPreferredW(), elementWidth);
  112.         }
  113.         cols = width / elementWidth;
  114.         int rows = btn_name.length / cols;
  115.         mainMenu.setLayout(new GridLayout(rows, cols));//GridLayout为九宫图的排列方式
  116.         mainMenu.addCommand(exitCommand);
  117.         mainMenu.setCommandListener(this);
  118.         mainMenu.show();
  119.     }
  120.     /**
  121.      * 控件处理函数
  122.      */
  123.     public void actionPerformed(ActionEvent evt) {
  124.         try{//通过异常处理来判断事件来源
  125.             Command cmd = evt.getCommand();
  126.             if(cmd.getCommandName().equals("Exit"))
  127.                     notifyDestroyed();
  128.         }catch(Exception e)
  129.         {
  130.             String sel_button=((Button)(evt.getSource())).getText();//取得所选按钮的名称
  131.             if(sel_button.equals("Image 1"))
  132.                new AnimationDemo().form.show();
  133.             else if(sel_button.equals("Image 2"))
  134.                 new PaintingDemo().form.show();
  135.             else if(sel_button.equals("Image 3"))
  136.                 new LayoutDemo().form.show();
  137.         }
  138.     }
  139. }

好了,本文就介绍到这里,关于J2ME LWUIT的摸索还在继续,希望大家多多支持LWUIT,让它越做越好!

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: J2ME GUI实战之二 —— LWUIT实现手机九宫图

J2ME GUI实战之二 —— LWUIT实现手机九宫图:目前有6 条留言

  1. 6楼
    hc0120:

    已经解决。呵呵

    2009-05-20 09:36 [回复]
  2. 用了下lwuit,觉得很好。这个九宫图的,触摸屏事件如何获取,我想在鼠标点击,放开时加上一些自己的处理。如查能用pointerPressed()/pointerReleased()的话,怎么用呢,谢谢!

    2009-07-30 14:25 [回复]
  3. 4楼
    hellogv:

    重载pointerPressed()/pointerReleased(),在里面加入自己的代码

    2009-07-31 07:30 [回复]
  4. 地板
    匿名用户:

    不好意思,請問一下,套用你的Code,於100至113行會error,使用Java Sdk 3

    2010-01-29 19:51 [回复]
  5. 板凳
    weipt:

    不好意思,源码用什么打开啊?

    2012-05-12 10:42 [回复]
  6. 沙发
    hellogv:

    [reply]weipt[/reply]
    NetBeans

    2012-05-13 07:48 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐