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ランキング
-
C# DataGridView のCellPaintin...
-
VB.NET フォーム上に描いたグ...
-
Exception occurred during eve...
-
DirectXのスプライト機能で3D回転
-
BMP画像を画像処理して連続に表...
-
エクセルVBAで、条件に一致する...
-
複数の変数を宣言する時、同時...
-
変数名の付け方
-
「タイプ初期化子が例外をスロ...
-
private static という変数の修飾
-
エクセルVBA 画像を貼り付ける...
-
パワーポイントのVBAでテキスト...
-
SQLを連続発行する時の正しい(?...
-
生成したインスタンスを削除す...
-
VBAでの[]
-
インスタンス参照でアクセスで...
-
コマンドライン引数のチェック
-
Java初級 引数に適用できません
-
エクセルVBAにおけるON TIMEメ...
-
C#のクラスで値渡しをする
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
C# DataGridView のCellPaintin...
-
VB.NETのSendMessageを教えてく...
-
canvasで表示されてる画像を1...
-
Exception occurred during eve...
-
requestanimationframeを一斉に...
-
Labelコントロールの背景をグラ...
-
SwingとEDT(イベントディスパッ...
-
C# リストビューの特定のセルの...
-
MFCでMSペイントみたいなツー...
-
画面のちらつきの原因が知りた...
-
JAVAでの背景画像表示
-
Androidで画像の中で指定した範...
-
このプログラミングをどう組み...
-
描画してもウィンドウをリサイ...
-
JavaScriptで直線を描画したい
-
SwingのpaintComponent(...
-
BMP画像を画像処理して連続に表...
-
Java 15パズルを作ったのですが...
-
<JFreeChart> 縦軸の値の間隔を...
おすすめ情報