- ベストアンサー
描画処理が実行されない
while(gameflag==true){ (数値設定) repaint(); long start = System.currentTimeMillis(); while(System.currentTimeMillis()<start+1000){ } } 上記のようにwhileループの中で数値などの設定を行い、描画をし、遅延をしているのですが他の処理はちゃんと実行されるのになぜか描画処理だけが行われません。また、whileループ外でも描画を行っていますがその時点ではきちんと描画されます。描画されない原因はどのようなことが考えられるでしょうか?描画はpaintComponent(Graphics g) メソッドで描画しています。
- sakusha
- お礼率42% (3/7)
- Java
- 回答数4
- ありがとう数2
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>描画されない原因はどのようなことが考えられるでしょうか? Swingの描画はダブルバッファを使っている関係上、描画メソッドを呼び出したときではなく、その後、もっとも早く再描画できるタイミングで表示を更新します。このため、while内で描画を行っている場合には、そのwhileを抜け、処理が終了した頃で表示が更新されるため、while中で行っている描画処理は見えません。(途中の描画は見えず、最終的に描画された状態だけが表示される) この処理は、別スレッドを使って実行していますか? メインスレッドでは、上のような理由で途中の更新は見えませんから、マルチスレッドで実行し、描画ごとに強制的にrepaintするなどしてみてはいかがでしょう。
その他の回答 (3)
- bgbg
- ベストアンサー率53% (94/175)
repaint()はイベントキュースレッドに処理を投げますので、メインメソッド系のスレッドが占有状態でもマシンパワーが十分なら適切に再描画されるはずです。 しかしイベントキュースレッドが占有状態だとrepaint()の処理も回らないので再描画が行われない、または後回しになる可能性があります。 repaint()と同時に別のイベントが発生していないでしょうか。あるいは再描画の処理自体が重いというのもあるかもしれません(画像を一回一回読み込んでいるようですし) とりあえずは、Thread#sleepで様子を見ることをお勧めします。
お礼
無事解決できました、ありがとうございます。whileループが原因というのもありましたが処理手順にばかり気をとられ、無駄なスレッドが増えて複雑になっているのもありました。今後はプログラムを定期的に整理するように気をつけます。
- isle
- ベストアンサー率51% (77/150)
ループの中に Thread.yield(); を入れてみたらどうでしょう? タイミングクリティカルな処理でなければ Thread.sleep(n); //要例外キャッチ を適切に呼び出すのがよろしいかと。
- bgbg
- ベストアンサー率53% (94/175)
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
- repaint処理が実行されなくなる時があります
下記のように1秒周期で描画更新するように していますが、repaint処理が実行されなくなる ことがあります。repaintからupdateが呼び出されて いないことまでは判ったのですが、このような ことがあるのでしょうか?また、回避策があれば 教えて下さい。 ------------------------------------------------ public void run() { try { while ( m_bLoopFlag ) { repaint(); Thread.sleep( 1000 ); } } catch( Exception e ) { } finally { m_bEndFlag = true; } } public void update( Graphics g ) { paint( g ); }
- ベストアンサー
- Java
- SwingのpaintComponent()メソッドについて
JAVA初心者です、宜しくお願いします。 参考書で、Swingについて以下のようなコメントを見つけました、ただ何故そうなのかの理由を書いていません。 以下の内容はどのような理由からそうなるのでしょうか。 「Swing コンポーネントでは、メソッドpaintは推奨されていません。 paintComponentをプログラムから呼び出してはいけません。描画をしたい場合は、 paintComponent をオーバー ライドしたクラスの repaint() メソッドを呼び出します。 Swing コンポーネント上に描画するには、 描画したいコンポーネントのクラスを継承したクラスで、 メソッド paintComponent(Graphics g) をオーバーライドし、 パラメータで渡された g に対して Graphics クラスのメソッドで描画をします。 オーバーライドした paintComponent の先頭で、このコンポーネントの土台を描画するために、 super.paintComponent(g) を呼び出しておきます。」 宜しくお願いします。
- ベストアンサー
- Java
- SwingのアプリケーションでのpaintComponentによる処理について
javaを学習している者です。 「マウスがクリックされたところを赤い四角を描画して、その前にクリックされて描画されていた赤い四角は同時に消える」という処理を実装したいのですが、うまくできず、赤い四角が残ってしまいます。 プログラムはpaintComponent(Graphics g)の中で、クリックされた場所で赤い四角を描画する処理だけ実装していて、マウスがクリックされるたび、mouseClicked(MouseEvent e)の中でrepaint()を呼ぶ、という風に書いているのですが、どう変えればうまくいくでしょうか? 前に勉強していたアプレットではこのような感じで出来たと思うのですが・・・。 よろしくお願いします。
- ベストアンサー
- Java
- repaintが実行されません(iアプリ)
Java初心者なのですが、頑張ってテトリスをiアプリで作ろうと思っています。 何分オブジェクト指向などをあまり理解できていないためソースがいまいち見苦しいかと思いますが、よろしければ手助けしていただけると幸いです。 関係があると思われるメソッドだけを載せます。 以下、ソース----------------------------- public final class Tetris extends Canvas implements Runnable{ /** (変数などの設定が入ります) **/ Thread t = new Thread(this); t.start(); paintFrag = true; Thread tp = new Thread(this); GameLoop(); } //ゲームのメインループ public void GameLoop(){ //オープニングの表示 GameStart(); while(true){ //新しくミノを生成 //ゲームオーバーかどうかも同時にチェック if(CreateMino() == 1){ GameOver(); //ゲームオーバー時のメソッド } while(true){ //1000ミリ秒待つ try{ Thread.sleep(1000); } catch(Exception e){ } //ミノを1つ落下させる //1つ下に固定済みブロックがあれば1を返す if(DropMino() == 1){ break; } } } } public void run(){ //30フレームで画面を再描画 if(paintFrag == true){ while(true){ try{ Thread.sleep(33); } catch(Exception e){ } System.out.println("テスト"); repaint(); } } //こっちではキー状態を監視 else{ while(true){ (まだ未実装です) } } } ソース終わり----------------------------- これで実行した場合、コンソール画面にはきちんと「テスト」とは33ミリ秒毎に表示されるのですが、実際のiアプリの画面には何も表示されずに真っ黒な状態のままです。 GameLoopの「while(true){}」のループを2つとも外した場合、起動してから1000ミリ秒は何も表示されず、1000ミリ秒以上経ってからは1マス落ちた状態のブロックが表示され、それ以後は何も動作がありません。 paintメソッドに「System.out.println("~~");」と記述してもこれはコンソール画面に表示されないので、どうやらGameLoopメソッドがループしている間はpaintメソッド自体が動作していないような感じなのですが、原因がなんなのか検討もつきません。 分かる方いらっしゃいましたらヒントでもいいので回答お願いします。 開発ツールはDoCoMoの公式サイトでダウンロードできるiappliTool for Doja 5.1(FOMA)を、Javaのバージョンは1.4.2_13を使用しています。
- 締切済み
- Java
- iPhone SDKで、ループしている間に描画を行う処理を入れているの
iPhone SDKで、ループしている間に描画を行う処理を入れているのですが、 ループから抜けた直前の最後の描画しか表示されません。 VBでいう DoEventsのようなシステムに処理を返す処理はありますか? そもそも ViewDidLoadの中でループさせてそこで何度も描画させる 処理の仕方自体おかしいでしょうか?
- ベストアンサー
- その他(プログラミング・開発)
- java repaint()に関して
プログラムで以下のpaintComponents内のデバックができません。 理由は一体何なのでしょうか? お願いします。 import java.awt.Graphics; import javax.swing.JPanel; public class MainPanel extends JPanel implements Runnable { Thread th; public MainPanel() { super(); } public void movestart() { th = new Thread(this); th.start(); } public void paintComponent(Graphics g) { System.out.println("このデバックができない"); super.paintComponent(g); } public void run() { while (true) { System.out.println("ここのデバックはできている"); repaint(); try { th.sleep(100); } catch (Exception e) { } } } }
- ベストアンサー
- Java
- public void paint(Graphics g){
public void paint(Graphics g){ g.setColor(new Color(ci, ci, ci)); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.WHITE); g.drawString("Canvas表示", 20, 20); g.drawImage(image, x1, y1, this); g.drawImage(image1, x2, y2, this); } public void update(Graphics g){ paint(g); } public void run(){ //while(true)で永久ループ //imageの座標を変更する処理 //repaint(); } スレッドを使ってイメージの座標を変更し、イメージが動くプログラムを作りました。 これだと滑らかに動かないからpaintメソッドをもうひとつ作って 処理するpaintと描画するpaintとにわけたらいいと言われました。 ですがやりかたがわからないので教えてください。
- 締切済み
- Java
- Javaについて、時間比較で処理をbreakしたいのですが、次のように
Javaについて、時間比較で処理をbreakしたいのですが、次のように作ってみたのですが、endが解決できません。なにか手立てはないでしょうか? do { //何か実行する。 long end = System.currentTimeMillis(); }while((end-start)<=60);
- ベストアンサー
- Java
- 勝手にアプレットが停止します
アプレットが動作不良となる時があます。 アプレットの定周期(1秒、2秒など)の 更新描画にて、repaint()メソッドを呼び出していますが、 Javaからupdate()メソッドが呼び出されず、画面の 描画処理が行われていない状態となっていようです。 調べたところ、アプレットのrepaint()メソッド を呼び出すと、Javaからupdate()メソッドが 実行され、paint()メソッドに記述している 各描画処理が行われるはずですが、下記のように 実行されていないようです。 非常に困っていますので、どなたかご教授お願いします。 repaint() ↓ update() ←なぜかJavaから実行要求が来ない ↓ paint()
- ベストアンサー
- Java
- iアプリ、それともJava(?)における文字表示の挙動について
iアプリ、それともJava(?)における文字表示の挙動について public void run(){ Graphics g = getGraphics(); while(true){ g.lock(); int i = 1; g.drawString("hogehoge",0,15 + i); //下にずれて表示されていく。 g.unlock(true); i++; }//while() }//run() 【質問】 whileループで繰り返し、上記のような処理がなされる場合、 一度表示した文字は残らず、ループの繰り返し毎に、 何も表示されていない所に、1から表示しなおされる形で、 処理が行われています。 例えば、ループなしの簡単なHellow World!のような文字表示サンプルプログラムですと、 そのHellow World!という文字列を1度描画したら、そのまま描画されたままですが、 whileループの場合、 ループごとに、真っ白な状態に初期化され、その上に次の描画が行われ…ということを、 繰り返しているようです。 この時の、「毎回のループの初めに行われているであろう、真っ白な状態への初期化」は、 どういった仕組みで行われているのでしょうか? 別の言い方で言うと、 「whileループの描画処理が、蓄積されていかないのは何故?また、その蓄積がなされない理由(しくみ)はどこに?」 となります。 上記whileループの挙動に対し、 文字と文字が重なっていく、とか、 上段から下段へと文字がどんどん蓄積されながら描画されていく、 なんてことを想定していたわけですが、 実際には、そうはならないため、質問をさせて頂きました。、 このあたりのことについて、どなたか、お分かりになる方、ご教示下さい。 宜しくお願い致します。
- ベストアンサー
- Java
お礼
無事解決できました、ありがとうございます。以前マルチスレッドを使った方法で失敗したのでこの方法を使ったのですがSwingの描画では逆効果だったのですね。以後マルチスレッドや描画処理の呼び出しには気をつけます。
補足
なるほど、Swingの描画にそのような落とし穴があったのですね。 whileループは別のスレッドで行っていますがそれでもwhileループではなくマルチスレッドを使ったほうがよろしいのでしょうか?