2016-05-12 26 views
1

私はまだ学生です。私はボールを描き、自分で動く方法を学ぼうとしています。ここでなぜ私のボールは点滅し続けますか?

はコードです:

import javax.swing.*; 
import java.awt.*; 

public class Ball extends JFrame 
{ 
int x = 50; 
int y = 50; 
int rad = 30; 

Ball(){ 
    setSize(500,500); 
    setTitle("Ball"); 
    setVisible(true); 
} 

void move() 
{ 
    if (x < getWidth() - rad){ 
     x = x + 1 ; 
    } 
    try 
    { 
     Thread.sleep(100); 
    } 
    catch(Exception e) 
    {   
    } 
} 

public void paint(Graphics g) 
{ 
    super.paint(g); 
    g.fillOval(x,y,rad,rad); 
} 
public static void main(String args[]) 
{ 
    Ball b = new Ball(); 
    while(true){ 
     b.move(); 
     b.repaint(); 
    } 
} 
} 

私はプログラムを実行すると

ボールが右に動いているので、私はこのコードの動作にそれの60%を言うだろうが、それはいくつかのために点滅し続けます理由と私はなぜ知っていない。

それは私のコンピュータの問題、またはコードや何らかのバグですか?私は日食ルナに

+1

例外を捕まえるときは、何か問題が起きたときにわかるように、少なくとも何かを印刷してください。 – Gendarme

+1

これは、ボールが再描画されたことに起因すると思われます。ボールを再描画して再描画する必要があります。わずかな遅れがあり、点滅が発生します。 –

+0

私のためにうまく動作します。点滅しない。私はあなたのJFrameにデフォルトのクローズ操作を追加します:http://stackoverflow.com/questions/7799940/jframe-exit-on-close-java – ManoDestra

答えて

2

を使用しています

これは、画面の更新あなたはそれを表示したいデータの一部だけを見る非常に古典的な問題です。

この場合、JFrameのupdate(Graphics)はfillRectで画面を消去し、paint(Graphics)を呼び出してfillOvalでボールを描画します。

fillRectとfillOvalの間で画面が更新されると、ボールが一時的に消え、点滅(別名点滅)が発生します。

解決策はダブルバッファリングで、すべてのグラフィックス操作がオフスクリーンイメージに描画され、その後、1回の操作でウィンドウに描画されます。

これはJPanelで無料で入手できるものですので、JFrameの代わりにコードを継承するようにコードを変更してください(これはどの場合でも良い方法です)。ここでは、最小限のコード変更である:

import javax.swing.*; 
import java.awt.*; 

public class Ball extends JPanel 
{ 
int x = 50; 
int y = 50; 
int rad = 30; 

void move() 
{ 
    if (x < getWidth() - rad){ 
     x = x + 1 ; 
    } 
    try 
    { 
     Thread.sleep(100); 
    } 
    catch(Exception e) 
    {   
    } 
} 

public void paint(Graphics g) 
{ 
    super.paint(g); 
    g.fillOval(x,y,rad,rad); 
} 
public static void main(String args[]) 
{ 
    Ball b = new Ball(); 
    JFrame frame = new JFrame(); 
    frame.add(b); 
    frame.setSize(500,500); 
    frame.setVisible(true); 

    while(true){ 
     b.move(); 
     b.repaint(); 
    } 
} 
} 

これが無料点滅しなければならないが、それでもぎくしゃくかもしれません。

アニメーションをスムーズにするには、通常100ミリ秒ごとに更新するのではなく、フレーム間のタイミングとフレームドロップを考慮し、時宜を得た再描画ができるようにします。

関連する問題