私のアプレットがクリーンな環境から初めて起動すると、私の期待通りに動作します。私は、ジェネリックプロセッシング用とグラフィックス用の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()
の呼び出しに過ぎませんが、実行環境は微妙に変更されています。
私の質問は、再起動と再読み込み操作の重要性(使用される時期)と、アプレットが発生したときにアプレットが失敗するという問題ですか?