1. 程式人生 > >走上j2me的道路 第一集

走上j2me的道路 第一集

剛開始實習 近期公司成立了android研發小組 我和幾個同事一起被選進去做培養。以後不做J2EE了,老大說我們每天自己學習新技術,我呢會及時更新部落格,貌似明天先叫我們看j2me,我一定要加油 我現在有最寶貴的青春做後盾 沒老婆沒孩子拼了
今天更新了
首先是以段程式碼 用上下左右控制小球移動

---------------------------入口類--------------------------------------
package day01;

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Image;

public class MyDisPlay extends MIDlet {

private Display display;

public MyDisPlay() {
display = Display.getDisplay(this);
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
System.out.println("destroyApp");
System.out.println("destroyApp執行緒"+Thread.currentThread());
}

protected void pauseApp() {
System.out.println("pauseApp");
}

protected void startApp() throws MIDletStateChangeException {
System.out.println("startApp");
MyCanvas mc = new MyCanvas();
mc.setTitle("畫布");
mc.setFullScreenMode(true);
mc.sizeChanged(200,100);

display.setCurrent(mc);
}

}
---------------程式入口類-----------------------------------

--------------------畫布類-------------------------------------
package day01;

import java.io.IOException;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

public class MyCanvas extends Canvas implements Runnable {

private int type;
private int x = 100;
private int y = 100;
private Image img;

public MyCanvas() {
Thread th = new Thread(this);
th.start();
}

protected void paint(Graphics g) {
System.out.println("paint執行緒 " + Thread.currentThread());
System.out.println("paint");
g.setColor(0xffffff);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(0xff0000);
g.fillArc(x, y, 50, 50, 0, 360);

}

public int getGameAction(int keyCode) {
// TODO Auto-generated method stub
return super.getGameAction(keyCode);
}

public int getKeyCode(int gameAction) {
// TODO Auto-generated method stub
return super.getKeyCode(gameAction);
}

public String getKeyName(int keyCode) {
// TODO Auto-generated method stub
return super.getKeyName(keyCode);
}

public boolean hasPointerEvents() {
// TODO Auto-generated method stub
return super.hasPointerEvents();
}

public boolean hasPointerMotionEvents() {
// TODO Auto-generated method stub
return super.hasPointerMotionEvents();
}

public boolean hasRepeatEvents() {
// TODO Auto-generated method stub
return super.hasRepeatEvents();
}

protected void hideNotify() {
// TODO Auto-generated method stub
super.hideNotify();
System.out.println("hideNotify");
System.out.println("hideNotify執行緒 " + Thread.currentThread());
}

public boolean isDoubleBuffered() {
// TODO Auto-generated method stub
return super.isDoubleBuffered();
}

protected void keyPressed(int keyCode) {
// TODO Auto-generated method stub
super.keyPressed(keyCode);

System.out.println(keyCode + " keyPressed");
System.out.println("keyPressed執行緒 " + Thread.currentThread());
type = keyCode;
}

protected void keyReleased(int keyCode) {
// TODO Auto-generated method stub
super.keyReleased(keyCode);
System.out.println(keyCode + " keyReleased");
System.out.println("keyReleased執行緒 " + Thread.currentThread());
type=-5;
}

protected void keyRepeated(int keyCode) {
// TODO Auto-generated method stub
super.keyRepeated(keyCode);

System.out.println(keyCode + " keyRepeated ");
System.out.println("keyRepeated執行緒 " + Thread.currentThread());
}

protected void pointerDragged(int x, int y) {
// TODO Auto-generated method stub
super.pointerDragged(x, y);
}

protected void pointerPressed(int x, int y) {
// TODO Auto-generated method stub
super.pointerPressed(x, y);
}

protected void pointerReleased(int x, int y) {
// TODO Auto-generated method stub
super.pointerReleased(x, y);
}

public void setCommandListener(CommandListener l) {
// TODO Auto-generated method stub
super.setCommandListener(l);
}

public void setFullScreenMode(boolean mode) {
super.setFullScreenMode(mode);
System.out.println("setFullScreenMode");
System.out.println("setFullScreenMode執行緒 " + Thread.currentThread());
}

protected void showNotify() {
super.showNotify();
System.out.println("showNotify");
System.out.println("showNotify執行緒 " + Thread.currentThread());
}

protected void sizeChanged(int w, int h) {
// TODO Auto-generated method stub
super.sizeChanged(w, h);
System.out.println("sizeChanged" + w + " " + h);
System.out.println("sizeChanged執行緒 " + Thread.currentThread());
}

public void run() {
while (true) {
System.out.println("不死執行緒"+Thread.currentThread());
switch (type) {
case -1:
y -= 10;
try {
Thread.currentThread().sleep(100);
repaint();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case -2:
y += 10;
try {
Thread.currentThread().sleep(100);
repaint();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case -3:
x -= 10;
try {
Thread.currentThread().sleep(100);
repaint();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case -4:
x += 10;
try {
Thread.currentThread().sleep(100);
repaint();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
default:
break;
}
}
}

}
------------------------------總結--------------------------------
用了執行緒控制小球移動 此程式正常執行
我使用了很多標記語句(列印語句)發現了很多問題:
1。在迴圈體中寫repaint();不管你寫幾次,他只執行一次
例:for(int i=0;i<10;i++){
System.out.println("--i--");
repaint();
}
結果只執行10 次列印1次repaint();根據paint()只被呼叫一次判斷的,沒明白。
把 repaint();換成serviceRepaints() 竟然一次也不列印,奇怪。

2.上下左右控制 事件 流程我通過標記語句明白了
於是我在構造器中呼叫控制事件,結果一點反應也沒 仍然只執行paint()1次,和不寫一樣(因為paint()必然執行一次)。
構造器程式碼如下:
for(int i = 0;i<10;i++){
keyPressed(-1);
keyReleased(-1);
}
我想可能事件觸發必須硬體輸入,並不是我表面想的那樣,(也就是無法用程式碼實現)。
3.在構造器中寫repaint(),程式也完全無視,寫不寫都只執行一次paint().

我猜可能是訊息回撥機制,下次更新解決上面的問題...