2011-07-26 4 views
1

난 그냥 ME 자바의 경이로움에 탐구를 시작했지만 스레드를 만들려고 할 때 좌절지고있다 .. 아래 이상한 오류 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

전화를하기 전에 에뮬레이터에서 테스트 했습니까? 그렇지 않다면 - 왜? 그렇다면 어떻게 된 것입니까?

코드와 관련하여 미끄러운을 제외하고 나에게 괜찮은 것처럼 보입니다. 생성자에서 스레드를 만들고 시작하는 두 줄. 차라리 에서 Display.setCurrent (thecanvas)를 생각했을 I 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

매우 흥미 롭습니다. 업데이트를 받으면 게시하십시오. 또한, 재설치가 실제로 어떻게되었는지 테스트/확인 했습니까? 제 말은 업데이트 된 버전을 설치하는 데 실패했을 때 관찰 한 결과가 이전 버전 일 수 있다는 것입니다. 나는 다시 설치하고 "threadless"버전 (잘 작동한다고 언급 한 버전)을 시작한 다음 다시 최신 버전으로 다시 설치하는 것과 같은 방법으로 이것을 확인했습니다. 아니면 더 나은 아직 '스플래시 화면'을 먼저 표시하고 일부 버전 식별자를 보여줄 줄. 텍스트 필드와 '시작'명령을 사용하는 간단한 양식이 될 수 있습니다. – gnat

+0

글쎄, 이건 당황 스럽네. 나는 '매뉴얼'방식으로 일을하고 싶다. - 나는 컴파일을 사용하고 + jar에 + jad를 추가하고, etc method ... 그것은 SDK를 사용할 때 에뮬레이터와 전화에서 모두 완벽하게 작동합니다. 나는 실수를 찾아 내고, 잘못된 것을 발견하면 다시 게시 할 것입니다. 처음에는 에뮬레이터에 대한 제안과 이후에 일반적으로 도움이되는 팁에 대한 의견이 많습니다. – Thomas

1

Java에서는 일반적인 추측이지만 UI의 기본 스레드에서 "터치"할 수 없다는 것이 일반적인 규칙입니다. 글쎄, 약간은 대략 설명했지만이 주제에 관한 많은 기사가 있습니다.

paint() 또는 flushGraphics()과 같은 UI 메소드를 별도의 스레드에서 호출하지 않는 것이 좋습니다.

도움이되기를 바랍니다.

+0

의 끝 부분에 두 줄을 이동 것; 은 이것을 허용 할 것입니다 ... 아무리 많은 예제가이 접근 방법을 사용하는 것 같습니다 – Thomas