
while(gameflag==true){
(数値設定)
repaint();
long start = System.currentTimeMillis();
while(System.currentTimeMillis()<start+1000){
}
}
上記のようにwhileループの中で数値などの設定を行い、描画をし、遅延をしているのですが他の処理はちゃんと実行されるのになぜか描画処理だけが行われません。また、whileループ外でも描画を行っていますがその時点ではきちんと描画されます。描画されない原因はどのようなことが考えられるでしょうか?描画はpaintComponent(Graphics g) メソッドで描画しています。

No.2ベストアンサー
- 回答日時:
>描画されない原因はどのようなことが考えられるでしょうか?
Swingの描画はダブルバッファを使っている関係上、描画メソッドを呼び出したときではなく、その後、もっとも早く再描画できるタイミングで表示を更新します。このため、while内で描画を行っている場合には、そのwhileを抜け、処理が終了した頃で表示が更新されるため、while中で行っている描画処理は見えません。(途中の描画は見えず、最終的に描画された状態だけが表示される)
この処理は、別スレッドを使って実行していますか? メインスレッドでは、上のような理由で途中の更新は見えませんから、マルチスレッドで実行し、描画ごとに強制的にrepaintするなどしてみてはいかがでしょう。
この回答への補足
なるほど、Swingの描画にそのような落とし穴があったのですね。
whileループは別のスレッドで行っていますがそれでもwhileループではなくマルチスレッドを使ったほうがよろしいのでしょうか?
無事解決できました、ありがとうございます。以前マルチスレッドを使った方法で失敗したのでこの方法を使ったのですがSwingの描画では逆効果だったのですね。以後マルチスレッドや描画処理の呼び出しには気をつけます。
No.4
- 回答日時:
repaint()はイベントキュースレッドに処理を投げますので、メインメソッド系のスレッドが占有状態でもマシンパワーが十分なら適切に再描画されるはずです。
しかしイベントキュースレッドが占有状態だとrepaint()の処理も回らないので再描画が行われない、または後回しになる可能性があります。
repaint()と同時に別のイベントが発生していないでしょうか。あるいは再描画の処理自体が重いというのもあるかもしれません(画像を一回一回読み込んでいるようですし)
とりあえずは、Thread#sleepで様子を見ることをお勧めします。
無事解決できました、ありがとうございます。whileループが原因というのもありましたが処理手順にばかり気をとられ、無駄なスレッドが増えて複雑になっているのもありました。今後はプログラムを定期的に整理するように気をつけます。
No.3
- 回答日時:
ループの中に
Thread.yield();
を入れてみたらどうでしょう?
タイミングクリティカルな処理でなければ
Thread.sleep(n); //要例外キャッチ
を適切に呼び出すのがよろしいかと。
No.1
- 回答日時:
Swingを使用していると思われますが、paintComponentをオーバーライドしているクラスを補足してください。
(特にどのクラスからの継承なのか)この回答への補足
public class Syori_out extends JPanel implements MouseListener{
public Syori_out() {//コンストラクタ
setPreferredSize(new Dimension(WIDTH, HEIGHT));
addMouseListener(this);
}
public void gameImage(int tensu){
if(start==false)
{
for(int i=0;i<4;i++){
gameimage[i] =get.MakeImage(data.gazoudata[i]);
}
kasokuimage=get.MakeImage("../g_data/risu2.gif");
start=true;
}
else
{
for(int i=0;i<4;i++){
System.out.println(data.gazoudata[1]);
gameimage[i] =get.MakeImage(data.gazoudata[i]);
}
System.out.println(data.datastate);
}
repaint();
timer();
}
}
private static void timer(){
long start = System.currentTimeMillis();
while(System.currentTimeMillis()<start+1000){
}
}
プログラムの問題となっている部分を抜き出しました。whileループは
Game_mainというクラスにあり、そこで数値の設定を行った後、上記の
gameImage()が呼び出されます。get.MakeImage()では画像を取得しています。また、フレームはSyori_mainというクラスで生成し、上記の
Syori_outクラスをインスタンス化したものをパネルに貼り付けています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- 美術・アート メディバンペイント。マウスでの描画。 3 2022/11/09 10:53
- マンガ・コミック 漫画の練習方について 1 2022/06/06 19:26
- デザイン タブレットパソコンについて。 3 2022/10/22 15:19
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- その他(パソコン・周辺機器) NVIDIAのシェーダーキャッシュ 1 2022/05/30 22:36
- フリーソフト GIMPの使い方 1 2022/07/11 13:52
- デザイン 画像のようなラフなクロッキーを描くにはどの様な手順で描けばよいでしょうか? 色々調べましたがいまだに 2 2023/08/12 02:05
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
Labelコントロールの背景をグラ...
-
画面のちらつきの原因が知りた...
-
VB.NETのSendMessageを教えてく...
-
SwingとEDT(イベントディスパッ...
-
描画処理が実行されない
-
JButtonトップの二段表示
-
canvasで表示されてる画像を1...
-
C# リストビューの特定のセルの...
-
JAVAでの背景画像表示
-
javaアプレットでの文字化けと...
-
Java Script 色を塗れるプログ...
-
OpenLayersの描画を固定で表示...
-
jfreechartのXYLineChart作成
-
Hobbits PDF Libraryについて。
-
Java、jPanelに描画する
-
「ラバーバンド」について
-
アクセスで他アプリから復帰し...
-
メモリやCPU使用率が高すぎる?
-
パネルに字を書く方法?(JBuil...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETのSendMessageを教えてく...
-
VB.NET フォーム上に描いたグ...
-
MFCでMSペイントみたいなツー...
-
アクセスで他アプリから復帰し...
-
C# DataGridView のCellPaintin...
-
複数画像表示切り替え Visual c++
-
requestanimationframeを一斉に...
-
BMP画像を画像処理して連続に表...
-
C# リストビューの特定のセルの...
-
Labelコントロールの背景をグラ...
-
canvasで表示されてる画像を1...
-
JAVAでの背景画像表示
-
重なった要素上でのイベントで...
-
C#のGraphicsクラスについてです。
-
Java Script 色を塗れるプログ...
-
リスナについて
-
C# テキストボックスについて
-
Javaで文字の角度を変えて表示...
-
EXCELのVBAでフォームに文字を...
-
Canvas等の図形を移動する時,直...
おすすめ情報