Java me 有人能给我解释一下这个密码吗?

Java me 有人能给我解释一下这个密码吗?,java-me,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.set

这段代码中的大部分内容我都知道使用的原因,但是其他的东西

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();
    }
  }
}
上面这些东西,我发现很难知道它们为什么被使用…

它(您最初的代码片段,运行方法)看起来像一个线程,它的唯一任务就是每隔十分之一秒重新绘制组件

至于它指的是什么组件,您没有提供足够的信息。它取决于运行
run()
的对象

synchronized
位而言,这很可能是一种防止其他线程在
睡眠
期间对组件执行操作的方法

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

SlideMenu,
menu.paint(g),
menu.slideItem(1);
menu.slideItem(-1);
等待
正在进行时,将无法运行


顺便说一句,如果您在每行代码的开头使用四个空格(而不是
),您也可以获得漂亮的语法着色效果。如果您只是在编辑器中标记整个代码位并使用CTRLK,它将自动为您完成这项工作

synchronized (xyz) {
    // Work your magic here.
}

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

     +---------+
     |         |
 /   |         |   \
<    |  image  |    >
 \   |         |   /
     |         |
     +---------+
+---------+
|         |
/   |         |   \
<|图像|>
\   |         |   /
|         |
+---------+
(请原谅我可怜的图形能力,我会把它留在那里,以防下面的链接消失)

毫无疑问,
IconsCanvas
中的图像显示了要显示的菜单项。考虑到这一点,其他事情是有意义的

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

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

其他意见:

  • 幻灯片上
    ——需要查看它的实现
  • 菜单上。绘制(g)
    ——它授权幻灯片菜单本身绘制/刷新当前幻灯片
  • 菜单上,滑动项(1)/
    菜单。滑动项(-1)--不看幻灯片,它似乎是下一个/上一个导航机制
  • 应考虑制作<代码> ICONVAux和<代码> SlideMenu < /C>单身>

感谢pax的响应,但我怀疑y wait(100L)是否与in synchronized(this)放在一起,如果不是这样会发生什么?这意味着使用
sych(this)
的任何其他线程(其中
为该组件)都将等待,直到该线程停止等待。它看起来像是一种争用控制。我会更新我的答案。帕克斯,我已经更新了代码,如果你能找到代码的流程,请给我回复