Java初心者です。学校の課題で数学シュミレーションの結果を
Javaアプレットで表示するプログラムを作成しています。
この課題のJavaアプレットでは
複素平面のシュミレーション(計算結果を色のグラデーションで表示する)なのですが、
チョイスやボタン、マウスクリックなどによって、
初期条件や、描画方式、表示範囲などを指定することができます。
とりあえず、シュミレーション結果の描画は
試行錯誤の結果表示ができるようになりました。
paint(Graphics g)メソッドで数値計算、及び描画をしています。
(ちなみに余談かもしれませんがダブルバッファリングをしていて、
描画内容をImageとして書き込んでおいて描画するというかたちです。)
「計算途中(計算には結構時間がかかる)に
新たにボタンなどで指定条件が変更された場合、
現在の描画を中断して次の計算と描画を開始できるように
プログラムを改良しなさい」というのが今回の課題です。
つまり、「プログラム的にはpaintメソッドが実行されている途中に
特定のイベントが発生したらpaintメソッドを中断し、
もういちど呼びなおしなさい」ということかと思われます。
スレッドを作り、そのスレッドを中断するなども考えました。
インターネットで検索もしてみましたが、
なかなか情報を見つけられず困っています。
学生が作るプログラムなのでそんなに難しいことではないのだと思うのですが
解決できませんでした。
どうぞよろしくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
こんばんは。
時間のかかる処理を paintメソッド内で行うのは、よくありません。
この課題の趣旨は、「スレッドをうまく使いましょう」って事なんじゃないですかねぇ。
1.時間のかかる計算を別スレッドで処理し、結果を描画に反映させよう。
2.そのスレッドを途中でキャンセル可能にしよう。
って、事だと思います。
まず、最初の課題をスレッドを使う形になおした方がいいと思います。
どうもありがとうございます。どうやらスレッドをわけると、計算途中、またバッファ描画途中に描画してしまい、画面の半分や一部分しか表示されないようなのですが、どうしたらよいのでしょうか。
No.2
- 回答日時:
まず、計算中に画面の再表示要求をされた際に動作が止まらないように、paintメソッドの中では計算処理を行わず、別のスレッドで行って下さい。
paintメソッドはバッファーの内容を表示するだけにします。(ダブルバッファリングをしているのであればそのままでいいかと思います)
計算スレッドは再表示用バッファーを更新し最後にrepaintなどで再表示させます。(swingではinvokeLaterなどを使うことになります)
ここまでは、計算中に固まらないための処理です。
で、中断のさせかたですが、一般的なスレッドの停止と同じです。
終了フラグを用意し常にそのフラグをチェックしながら処理します。
計算条件が変わった時は、スレッドオブジェクトの終了フラグをセットし中断させます。
大きな流れは以上のようになります。
どうもありがとうございます。paintメソッドの中身を描画だけにしました。
public void paint(Graphics g){g.drawImage(buf,0,0,this);}
swingは使ったことがないのですが、難しそうですね。
簡単に現在のプログラムをswingにできますか?
No.3
- 回答日時:
swingとawtはいろいろ違うところがあるので、直すのはちょっと面倒です。
今回はこのままawtでいくのがいいかと思います。
swingは機能が多い分、ルールも多いです。
それと、前回書き忘れましたが、計算スレッドのバッファーの更新は、paintメソッドで表示するのとは別のものにして下さい。
計算が終わったときに、paintで表示するバッファーにコピーし再表示します。
こうすることで計算中の再表示でも、変な画面にならずにすみます。
バッファを2つ用意するということでしょうか?
buf2 = createImage(500,560);
buf2_g = buf2.getGraphics();
でもうひとつ用意してbuf=buf2などとするのでしょうか。
クラスなのでコピーはイコールでつなげないような気がしますが、
どうしたらよいのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Chrome(クローム) Chromeの描画領域を2分割して異なるスクロール位置を同時に表示させることはできますか 1 2023/03/01 16:53
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Excel(エクセル) エクセルのSUM関数について 4 2023/04/18 10:37
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAVAでの背景画像表示
-
<JFreeChart> 縦軸の値の間隔を...
-
GDI+で描画した画像を消去する...
-
Java、jPanelに描画する
-
JavaScriptで直線を描画したい
-
SwingのpaintComponent(...
-
VB.NET フォーム上に描いたグ...
-
BMP画像を画像処理して連続に表...
-
Java 15パズルを作ったのですが...
-
VB.NETのSendMessageを教えてく...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
c++,ある関数のクラスから別の...
-
private static という変数の修飾
-
3年間同じクラスになる確率
-
配列の重複する値とその個数を...
-
コマンドプロンプト実行後に画...
-
変数名の付け方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
VB.NETのSendMessageを教えてく...
-
JAVAでの背景画像表示
-
C# DataGridView のCellPaintin...
-
重なった要素上でのイベントで...
-
C# リストビューの特定のセルの...
-
Androidで画像の中で指定した範...
-
画面のちらつきの原因が知りた...
-
複数画像表示切り替え Visual c++
-
Labelコントロールの背景をグラ...
-
VS Treeview のデザイン変更
-
描画処理が実行されない
-
GDI+で描画した画像を消去する...
-
このプログラミングをどう組み...
-
canvasで表示されてる画像を1...
-
ドラッグして矩形を描くには
-
getGraphics()の意味を教えて...
-
Canvas等の図形を移動する時,直...
-
DirectXのスプライト機能で3D回転
-
Exception occurred during eve...
おすすめ情報