任何人都能解释一下这段代码吗?

时间:2010-07-14 07:12:40

标签: java-me

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class SlideImage extends MIDlet{
  private Display display;

  public void startApp(){
    display = Display.getDisplay(this);
    display.setCurrent(new IconsCanvas()); 
  }

  public void pauseApp(){}

  public void destroyApp(boolean unconditional){
    notifyDestroyed();
  }
}

class IconsCanvas extends Canvas implements Runnable{
  SlideMenu menu = null;

  public IconsCanvas(){
    Image[] image = new Image[10];     
    try{
      image[0] = Image.createImage("/bollywood-height.png");
      image[1] = Image.createImage("/212229_1193669628.png");
      image[2] = Image.createImage("/95936_50.png");
      image[3] = Image.createImage("/shreya.png");
      image[4] = Image.createImage("/Aishw.png");
      image[5] = Image.createImage("/karishma.png");
      image[6] = Image.createImage("/tmb_jiahkhannishabd.png");
      image[7] = Image.createImage("/amisha.png");
      image[8] = Image.createImage("/shilpashetty.png");
      image[9] = Image.createImage("/priti.png");

      menu = new SlideMenu(new String[]{"1", "2", "3", "4", 
      "5", "6", "7", "8", "9", "10"},  
        image,  getWidth(),  getHeight());
      new Thread(this).start();
    }catch(Exception e){
      e.printStackTrace();
    }
  }

  protected void paint(Graphics g){
    menu.paint(g);
  }

  public void keyPressed(int key){
    int gameKey = getGameAction(key);
    if(gameKey == Canvas.RIGHT){
      menu.slideItem(1);
    }else if(gameKey == Canvas.LEFT){
      menu.slideItem(- 1);
    }
  }

  public void run(){
    try{
      while(true){
        repaint();
        synchronized(this){
          wait(100L);
        }
      }
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

此代码中的大部分内容都是我使用的原因..但其余的东西如

SlideMenu,
menu.paint(g),
menu.slideItem(1);
menu.slideItem(-1);

以上事项,我很难知道为什么使用它们......

2 个答案:

答案 0 :(得分:4)

它(您的原始代码段,run方法)看起来像一个线程,其唯一的任务就是每十分之一秒重新绘制一次该组件。

至于它所指的组件,您没有提供足够的信息。这取决于run()正在运行的对象。

synchronized位而言,当这个线程在sleep范围内时,这很可能是一种阻止其他线程对组件执行操作的方法。

如果this是对象xyz,那么任何其他尝试执行块的线程如:

synchronized (xyz) {
    // Work your magic here.
}
<{1}}正在进行中,

将无法运行。


顺便说一句,如果你在每个代码行的开头使用四个空格(而不是wait),你也会得到漂亮的语法着色。如果您只是在编辑器中标记整个代码并使用 CTRL K ,那么它将自动执行此操作。


而且,就您的更新而言,SlideMenu(this page上的图片)似乎是一个菜单,其中一个项目显示在屏幕上,左/右箭头允许您滚动:

<pre>

(原谅我可怜的图形能力,如果下面的链接消失,我会留在那里)。

alt text

毫无疑问, +---------+ | | / | | \ < | image | > \ | | / | | +---------+ 中的图像会显示要显示的菜单项。考虑到这一点,其他事情是有道理的。

  • IconsCanvas,我已经描述过了。
  • 调用
  • SlideMenu显示新菜单以响应menu.paint(g)获取绘画请求。
  • IconsCanvas根据参数向左或向右滑动菜单。
  • 如果图像实际上向左或向右平滑滚动,那么现在100毫秒更有意义。

答案 1 :(得分:0)

在上面的代码片段中,在synchronized块上,作者的目的只是等待/休眠以便合作并让其他线程运行,而wait()必须始终为synchronized。但是没有必要排队那么多重绘,因为没有真正的动画,只是在前进到下一个/上一个时显示静态幻灯片(图像);在显示新幻灯片(或来电等)之前,Canvas不会失效,这意味着只有在显示新幻灯片时才能重新绘制。请注意,如果需要“平滑滚动”,则此类效果应由SlideMenu本身实现,其中还必须处理重绘()调度(与IconCanvas对比)

其他评论:

  • 开启SlideMenu - 需要查看其实施情况
  • menu.paint(g)上 - 它委托给幻灯片菜单本身来绘制/刷新当前幻灯片
  • menu.slideItem(1); / menu.slideItem(-1); - 不看SlideMenu,它似乎是下一个/上一个导航的机制
  • 您应该考虑制作IconCanvasSlideMenu单身人士。