2016-06-27 2 views
0

の場合、表示がちらつきます。私はそれを止めることができないと私はそれがちらつきを止める方法を知りたいです。私もここにswing.timerを追加しようとしましたが、まだ何もしません。 パッケージゲーム;あなたのペイント方法ではJFrameのペイントを使用しているときにJava JFrameペイントメソッドの表示がちらつきが

public class Play extends JFrame implements MouseMotionListener, MouseListener, KeyListener, ActionListener { 

    private int _xPad,_yPad,_xdir,_ydir; 
    private Brick[][] _bricks; 
    private Ball _gameBall; 
    private Timer _timer; 

    public Play(int[][] board){ 
     super("Elemental Brick Breaker"); 
     _xdir = 0; 
     _ydir = 0; 
     _xPad = 350; 
     _yPad = 500; 
     _timer = new Timer(1000,this); 
     _timer.start(); 
     _gameBall = new FireBall(_xPad,_yPad); 
     _bricks = new Brick[8][10]; 
     int x = 75, y = 40; 
     for(int i = 0 ; i < 8 ; i++) { 
      for(int j = 0 ; j < 10 ; j++) { 
       _bricks[i][j] = new FireBrick(x,y); 
       x = x + 65; 
       } 
      y = y + 25; 
      x = 75; 
     } 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     g.fillRect(_xPad, _yPad, 120, 10); 
     for(int i = 0 ; i < 8 ; i++) { 
      for(int j = 0 ; j < 10 ; j++) { 
       g.fillRect(_bricks[i][j].getX(), _bricks[i][j].getY() , 60, 20); 
       } 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
} 
+3

軽量コンポーネント(JPanelなど)を使用し、そのメソッドの「paintComponent」メソッドをオーバーライドします。 – copeg

+0

"Swingプログラムは、' paint() 'をオーバーライドするのではなく、' paintComponent() 'をオーバーライドする必要があります。" - [* AWTとスイングのペイント:ペイント方法*](http://www.oracle.com/technetwork/java/painting-140037.html#callbacks) – trashgod

+0

"スイングプログラムはpaintComponent()をオーバーライドする必要があります:" JFrameにはpaintComponentがありません - あなたはそれに何を言いますか? – gpasch

答えて

-1

を行うあなたは、このアプローチを試すことができます:コンストラクタで

im=createImage(getWidth(), getHeight()); 

で物事を描画するために別のイメージを持っています。

塗料で次に

:短期で

g.drawImage(im, 0, 0, this); 

g2.fillRect etc 

が、その後グラム上の画像を描画:

Graphics g2=im.getGraphics(); 

をし、G2のグラムにrelagatedすべてのコマンドを適用します

public void paint(Graphics g) { 
    Graphics g2=im.getGraphics(); 
    g2.fillRect(_xPad, _yPad, 120, 10); 
    for(int i = 0 ; i < 8 ; i++) { 
     for(int j = 0 ; j < 10 ; j++) { 
      g2.fillRect(_bricks[i][j].getX(), _bricks[i][j].getY() , 60, 20); 
      } 

    g.drawImage(im, 0, 0, this); 
    } 
} 

と更新方法があります。

public void update(Graphics g) { paint(g); } 

- 次のように私はあなたのクラスを単純化している

を: - それがちらつきを生成しません - 私はそれを元に戻す場合は、それを持っているとして、それがちらつきを生成します。

class Play extends JFrame implements ActionListener { 

private int _xPad,_yPad,_xdir,_ydir; 
private Rectangle[][] _bricks; 
// private Ball _gameBall; 
private javax.swing.Timer _timer; 
Image im; 

public Play(){ 
    super("Elemental Brick Breaker"); 
    setSize(1000, 500); 
    _xdir = 0; 
    _ydir = 0; 
    _xPad = 350; 
    _yPad = 500; 
    _timer = new javax.swing.Timer(1000,this); 
    _timer.start(); 
//  _gameBall = new FireBall(_xPad,_yPad); 
    _bricks = new Rectangle[8][10]; 
    int x = 75, y = 40; 
    for(int i = 0 ; i < 8 ; i++) { 
     for(int j = 0 ; j < 10 ; j++) { 
      _bricks[i][j] = new Rectangle(x,y, 60, 20); 
      x = x + 65; 
      } 
     y = y + 25; 
     x = 75; 
    } 
    setVisible(true); 
    im=createImage(getWidth(), getHeight()); 
} 

public void paint(Graphics g) { 
    Graphics g2=im.getGraphics(); 
    g2.fillRect(_xPad, _yPad, 120, 10); 
    for(int i = 0 ; i < 8 ; i++) { 
     for(int j = 0 ; j < 10 ; j++) { 
      g2.fillRect(_bricks[i][j].x, _bricks[i][j].y , 60, 20); 
      } 
    } 
    g.drawImage(im, 0, 0, this); 
} 

public void update(Graphics g) { paint(g); } 

@Override 
public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 
    repaint(); 
    System.out.println("t"); 
} 
} 
+0

それはうまくいきません、どこで更新メソッドを呼び出すべきですか? – vertigo

+0

[スイングでの絵画](https://docs.oracle.com/javase/tutorial/uiswing/painting/)について読むことを強くお勧めします。'update'や' paint'をオーバーライドするのではなく、(JPanelのような)軽量コンポーネントを使ってペイントし、 'paintComponent'メソッドをオーバーライドしてください – copeg

-1

Graphics2D g2 = (Graphics2D) g; 
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
+0

は、このメソッドはGraphicsに対して未定義であると言います。 – vertigo

+0

@vertigo更新された回答を確認してください。 – HeroicO

+0

それは瞬間的にちらつきが増えました – vertigo

1

paintまたはupdateを上書きしないでください。ペイントは軽量コンポーネントを使用し、paintComponentメソッドをオーバーライドする必要があります。たとえば、次のようになります。

public class MyPanel extends JPanel{ 
    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     //custom painting 
    } 
} 
//elsewhere in your code - add the JPanel to the JFrame 
MyPanel myPanel = new MyPanel(); 
JFrame frame = new JFrame(); 
frame.add(myPanel); 

イベントの種類を再描画する場合は、インスタンスでrepaintを呼び出します。たとえば、ActionListenerの実装内で:

@Override 
public void actionPerformed(ActionEvent e){ 
    myPanel.repaint(); 
} 
関連する問題