プロが教える店舗&オフィスのセキュリティ対策術

Java初心者です。学校の課題で数学シュミレーションの結果を
Javaアプレットで表示するプログラムを作成しています。

この課題のJavaアプレットでは
複素平面のシュミレーション(計算結果を色のグラデーションで表示する)なのですが、
チョイスやボタン、マウスクリックなどによって、
初期条件や、描画方式、表示範囲などを指定することができます。

とりあえず、シュミレーション結果の描画は
試行錯誤の結果表示ができるようになりました。
paint(Graphics g)メソッドで数値計算、及び描画をしています。
(ちなみに余談かもしれませんがダブルバッファリングをしていて、
描画内容をImageとして書き込んでおいて描画するというかたちです。)

「計算途中(計算には結構時間がかかる)に
新たにボタンなどで指定条件が変更された場合、
現在の描画を中断して次の計算と描画を開始できるように
プログラムを改良しなさい」というのが今回の課題です。

つまり、「プログラム的にはpaintメソッドが実行されている途中に
特定のイベントが発生したらpaintメソッドを中断し、
もういちど呼びなおしなさい」ということかと思われます。

スレッドを作り、そのスレッドを中断するなども考えました。
インターネットで検索もしてみましたが、
なかなか情報を見つけられず困っています。
学生が作るプログラムなのでそんなに難しいことではないのだと思うのですが
解決できませんでした。

どうぞよろしくお願いします。

A 回答 (4件)

 こんばんは。



 時間のかかる処理を paintメソッド内で行うのは、よくありません。
 この課題の趣旨は、「スレッドをうまく使いましょう」って事なんじゃないですかねぇ。

1.時間のかかる計算を別スレッドで処理し、結果を描画に反映させよう。
2.そのスレッドを途中でキャンセル可能にしよう。

 って、事だと思います。

 まず、最初の課題をスレッドを使う形になおした方がいいと思います。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。どうやらスレッドをわけると、計算途中、またバッファ描画途中に描画してしまい、画面の半分や一部分しか表示されないようなのですが、どうしたらよいのでしょうか。

お礼日時:2011/06/10 23:33

まず、計算中に画面の再表示要求をされた際に動作が止まらないように、paintメソッドの中では計算処理を行わず、別のスレッドで行って下さい。



paintメソッドはバッファーの内容を表示するだけにします。(ダブルバッファリングをしているのであればそのままでいいかと思います)

計算スレッドは再表示用バッファーを更新し最後にrepaintなどで再表示させます。(swingではinvokeLaterなどを使うことになります)

ここまでは、計算中に固まらないための処理です。


で、中断のさせかたですが、一般的なスレッドの停止と同じです。
終了フラグを用意し常にそのフラグをチェックしながら処理します。


計算条件が変わった時は、スレッドオブジェクトの終了フラグをセットし中断させます。


大きな流れは以上のようになります。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。paintメソッドの中身を描画だけにしました。
public void paint(Graphics g){g.drawImage(buf,0,0,this);}
swingは使ったことがないのですが、難しそうですね。
簡単に現在のプログラムをswingにできますか?

お礼日時:2011/06/10 23:39

swingとawtはいろいろ違うところがあるので、直すのはちょっと面倒です。



今回はこのままawtでいくのがいいかと思います。

swingは機能が多い分、ルールも多いです。


それと、前回書き忘れましたが、計算スレッドのバッファーの更新は、paintメソッドで表示するのとは別のものにして下さい。
計算が終わったときに、paintで表示するバッファーにコピーし再表示します。

こうすることで計算中の再表示でも、変な画面にならずにすみます。
    • good
    • 0
この回答へのお礼

バッファを2つ用意するということでしょうか?
buf2 = createImage(500,560);
buf2_g = buf2.getGraphics();
でもうひとつ用意してbuf=buf2などとするのでしょうか。
クラスなのでコピーはイコールでつなげないような気がしますが、
どうしたらよいのでしょうか。

お礼日時:2011/06/13 10:47

おっしゃる通りバッファーを2つ作って下さい。



ダブルバッファリングと同じです。
というよりダブルバッファリングそのものですかね。
「コピー」に関しては、本当のコピーではなく、2つのバッファーの入れ替えでいいかと思います。
    • good
    • 0
この回答へのお礼

かなり時間をかけてがんばってみましたが、
どうしてもただしく表示できませんでした。
課題はできるところだけやって提出しました。
また時間のあるときにやってみたいと思います。
ありがとうございました。

お礼日時:2011/07/02 18:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!