2011-07-26 24 views
1

私はただのJava MEが、スレッドを作成しようとする欲求不満になってきたの素晴らしさに踏み込んで開始しました...以下奇妙なエラー

は絶対に罰金コンパイルコードです。しかし、G600にインストールして実行するとすぐに、「Java Game Error」がポップアップします。

私はそれをjarファイルに入れてインストールするという方法は、スレッドを持たないゲームを作成して正常に動作するため動作します。

import java.util.Random; 
import javax.microedition.lcdui.*; 
import javax.microedition.lcdui.game.*; 
import javax.microedition.midlet.*; 

public class CanvasTest extends MIDlet { 
Display display; 

public CanvasTest() { 

} 

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

public void pauseApp() {} 

public void destroyApp(boolean unconditional) {} 
} 
class TestCanvas extends GameCanvas implements Runnable { 
Font font; 

int width; 
int height; 

boolean running = true; 

public TestCanvas() { 
    super(false); 
    setFullScreenMode(true); 
    width = getWidth(); 
    height = getHeight(); 
    Thread thisThread = new Thread(this); 
    thisThread.start(); 

} 
public void paint(Graphics g) { 
    Random rand = new Random(); 
    g.setColor(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)); 
    g.fillRect(0, 0, width, height); 

} 
public void run() { 
    while(running) { 
    paint(getGraphics()); 

    flushGraphics(); 

    try { 
     Thread.sleep(50); 
    } 
    catch(InterruptedException ex) {} 
    } 
} 
}; 

注:はい、これはゲームではなく、単に私が直面している問題を示しています。

ありがとうございます!

答えて

0

電話の前にエミュレータでテストしましたか?そうでない場合 - なぜですか?もしそうなら、どうしたの?

コードに関しては、を除いて私には間違っています。コンストラクタからスレッドを作成して開始する2行。私はむしろ、私は display.setCurrent(thecanvas)を考えているだろうstartApp

public void startApp() { 
    TestCanvas theCanvas= new TestCanvas(); 
    display = Display.getDisplay(this); 
    display.setCurrent(theCanvas); 
    new Thread(theCanvas).start(); // add here and... 
} 
//... 
public TestCanvas() { 
    super(false); 
    setFullScreenMode(true); 
    width = getWidth(); 
    height = getHeight(); 
    // ...and remove here 
    // Thread thisThread = new Thread(this); 
    // thisThread.start(); 
} 
+0

提案は結果を変更しませんでしたが、実際これは私の最初のアプローチであり、投稿されたコードは回避策でした(残念です) 。 エミュレータの運賃については、お返事させていただきます。 – Thomas

+0

非常に興味深い - あなたが更新を得るときに投稿してください。また、再インストールが実際に行われたことを何らかの形でテスト/確認しましたか?私は、更新されたバージョンをインストールするといくつかの失敗があった場合、あなたが観察した結果が実際に前のバージョンの1つになる可能性があるということですか?私はこれを再インストールし、 "スレッドレス"バージョン(あなたがうまくいけばうまくいきました)を起動してから、最新のものを再インストールするようなものをチェックします。それとも、私は最初に表示され、いくつかのバージョン識別子を表示する 'スプラッシュ画面'を作成する方がよいでしょう。テキストフィールドとコマンド 'Start'を持つシンプルなフォームになる可能性があります – gnat

+0

これは恥ずかしいです、私は告白しています:私は 'マニュアル'のやり方でやりたいです - 私はコンパイル+ etcメソッド... SDKを使用すると、エミュレータと電話機で完全に正常に動作することがわかります。 私は自分の間違いを知りたいと思っています。何がうまくいかなかったかを見つけたらここに投稿します。 最初にエミュレータを提案し、その後一般的に役立つヒントを得たので、謝辞を言う。 – Thomas

1

Javaの一般的なルールは、メインスレッドからUIを「タッチ」できないということです。さて、これは少し大雑把に説明されていますが、トピックに関する記事が多数あります。

paint()またはflushGraphics()などのUIメソッドを別のスレッドから呼び出すことを避けることをお勧めします。

私はそれが役に立ちそうです。

+0

の終わりに次の2行を移動すると思います。 はこれを可能にします... 多くの例がこのアプローチを使用しているようです – Thomas