
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Labelコントロールの背景をグラ...
-
重なった要素上でのイベントで...
-
「タイプ初期化子が例外をスロ...
-
Java初級 引数に適用できません
-
レコード件数の表示
-
C# インスタンスの破棄
-
変数名の付け方
-
java eclipse 型に解決できません
-
インスタンス参照でアクセスで...
-
EclipseでJSPのコンパイルエラー
-
private static という変数の修飾
-
Excel VBA 定数にオブジェクト...
-
複数の変数を宣言する時、同時...
-
JSPで<SELECT>の中にDBから持っ...
-
VBA コピーが出来ません…!
-
エクセルVBAで、条件に一致する...
-
SQLを連続発行する時の正しい(?...
-
JTextFieldの入力制限
-
String.containsの反対機能はあ...
-
C# マルチスレッドにおける例外...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
Java、jPanelに描画する
-
VB.NETのSendMessageを教えてく...
-
SwingとEDT(イベントディスパッ...
-
C# DataGridView のCellPaintin...
-
Javaで文字の角度を変えて表示...
-
JAVAでの背景画像表示
-
複数画像表示切り替え Visual c++
-
イベントディスパッチングスレ...
-
C# リストビューの特定のセルの...
-
iアプリ作成 画像を描画できない
-
BMP画像を画像処理して連続に表...
-
SwingWorkerに関して
-
canvasで表示されてる画像を1...
-
アクセスで他アプリから復帰し...
-
GDI+で描画した画像を消去する...
-
重なった要素上でのイベントで...
-
ドラッグして矩形を描くには
-
Androidで画像の中で指定した範...
-
requestanimationframeを一斉に...
おすすめ情報