2011-09-09 11 views
12

私のアプレットがクリーンな環境から初めて起動すると、私の期待通りに動作します。私は、ジェネリックプロセッシング用とグラフィックス用の2つのスレッドを生成します。私は、イベントディスパッチスレッドからすべてのGUI操作コールを行います。 Start/Stopはアプレットビューアから正しく処理されますが、Restart/Reloadは正しく処理されません。アプレットのコンテンツペインに唯一のコンポーネントとしてdrawCanvasというキャンバスがあり、ダブルバッファリングを使用して描画します。AppletViewerから再ロードと再起動を正しく処理する

私はここでの問題を守ってください。

setupDrawCanvasは、次のように定義されて
public void start() { 
    /* ... some stuff */ 
    executeOnEDTAndWait( 
     new Thread() { 
      @Override 
      public void run() { 
       /* ... more stuff ... */ 
       setupDrawCanvas(); 

       if(drawCanvas.isDisplayable()) { 
        drawCanvas.createBufferStrategy(2); 
        /* ... some more stuff */ 
       } else { 
        /* This is where it runs into difficulties */ 
       } 
    /* ... */ 

private void setupDrawCanvas() { 
    setVisible(false); 
    setIgnoreRepaint(true); 

    getContentPane().removeAll(); 

    drawCanvas = new Canvas(); 

    drawCanvas.setName("drawCanvas"); 
    drawCanvas.setSize(
    newDrawCanvasDimension.width, 
    newDrawCanvasDimension.height); 
    drawCanvas.setIgnoreRepaint(true); 

    getContentPane().add(drawCanvas); 

    getContentPane().setVisible(true); 
    drawCanvas.setVisible(true); 
    setVisible(true); 
} 

はまた、ここに関連するコードを介して、第1の時間destroy()

public void destroy() { 
    /* .. some stuff .. */ 

    /* dispose of drawCanvas */ 
    drawCanvas.setVisible(false); 
    if(drawCanvas.getBufferStrategy() != null) { 
     drawCanvas.getBufferStrategy().dispose(); 
    } 

    /* reset and disable the applet's GUI */ 
    setVisible(false); 
    getContentPane().removeAll(); 
    removeAll(); 

    /* .. some more stuff */ 

にあります、すべてうまく動作します。 appletviewerから再起動すると、最初にstop()が呼び出され、すべてのスレッドが待機状態に入ります。次にdestroy()が呼び出され、すべてのスレッドを再び起動させて終了させます。また、doとをEDTで実行してウィジェットをクリーンアップし、setVisible(false)を実行します。だから、破棄が完了した後にappletviewerはinit/startを再度呼び出し、前述の領域でstart()に失敗する点を除いて、プロセスは以前と同じように繰り返されます。

appletviewerを使用してアプレットをクローンしてからクローンをリロードすると、クローンを再起動または再ロードしようとするとすべてが正常に動作することがわかりましたが2回目の例外でクラッシュします。

この問題をデバッグしようとしている間に私が気づいたのは、appletviewerとブラウザがと完全にのアプレットのホストと異なっていることです。彼らは同じ条件でinit()start()と呼んでいない。また、再起動とリロードは、stop() - >destroy() - >init() - >start()の呼び出しに過ぎませんが、実行環境は微妙に変更されています。

私の質問は、再起動と再読み込み操作の重要性(使用される時期)と、アプレットが発生したときにアプレットが失敗するという問題ですか?

答えて

6

ニース質問。 この質問に答えるには、まずJavaコードのブロックを理解する必要があります。 実行されるconstrutorの前に匿名の静的ブロックがあります。

package com.test; 

import java.applet.Applet; 
import java.awt.*; 

public class AppletTest extends Applet { 
    { 
     System.out.println("I m Anonymous block"); 
    } 

    static { 
     System.out.println("I m static block"); 
    } 

    public AppletTest() 
    { 
     System.out.println("I m constructor"); 
    } 

    public void init() 
    { 
     System.out.println("init"); 
    } 

    public void start() 
    { 
     System.out.println("start"); 
    } 

    public void stop() 
    { 
     System.out.println("stop"); 
    } 

    public void destroy() 
    { 
     System.out.println("destory"); 
    } 

    public void paint(Graphics g) 
    { 
     g.drawString("test Applet",10,10); 
    } 
} 

呼び出し:アプレットビューアを使用して、このクラスを実行しているとき

<applet code="AppletTest.class" height=300 width=300></applet> 

あなたは違いに注意することができます。 アプレットは、アプレットの再起動しながら

I m static block 
    I m Anonymous block 
    I m constructor 
    init 
    start 

を取得します初めて実行されている - あなたの2番目の質問について

stop 
destory 
init 
start 

とアプレットリロード上

stop 
destory 
I m Anonymous block 
I m constructor 
init 
start 

を、アプレットが保証するものではありません。異なるOS、ネットワーク、およびハードウェアコンポーネントで同じ出力を実行できます。

関連する問題