2016-06-27 10 views
0

Während ich Farbe von JFrame verwende, flackert mein Bildschirm viel. Ich kann es nicht stoppen und ich würde gerne wissen, wie es aufhören kann zu flackern. Ich habe auch versucht, den swing.timer hier hinzuzufügen, aber es macht immer noch nichts. Paket Spiel;Java JFrame-Farbmethoden-Anzeige flackert

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

Verwenden Sie eine Lightweight-Komponente (z. B. JPanel) und überschreiben Sie sie mit der Methode "paintComponent". Siehe [die Oracle-Tutorials] (https://docs.oracle.com/javase/tutorial/uiswing/painting/closer.html) – copeg

+0

"Swing-Programme sollten' paintComponent() 'überschreiben, anstatt' paint() 'zu überschreiben." - [* Malen in AWT und Swing: Die Malmethoden *] (http://www.oracle.com/technetwork/java/painting-140037.html#callbacks). – trashgod

+0

"Swing-Programme sollten paintComponent() überschreiben:" JFrame hat keine paintComponent - was sagst du dazu ??? – gpasch

Antwort

-1

Sie diesen Ansatz versuchen:

haben ein separates Bild Dinge ziehen auf:

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

in Konstruktor.

Dann in Farbe:

Graphics g2=im.getGraphics(); 

und gelten alle bis g auf g2 relagated Befehle:

g2.fillRect etc 

dann das Bild auf g ziehen:

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

kurz:

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); 
    } 
} 

und haben ein Update-Methode:

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

-

ich Ihre Klasse vereinfacht wie folgt: - es Flimmern nicht produzieren - wenn ich es, wie Sie es es Flimmern erzeugt haben zurückstellen.

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

es funktioniert nicht, wo sollte ich die Update-Methode aufrufen? – vertigo

+0

Ich empfehle dringend, über [Painting in Swing] zu lesen (https://docs.oracle.com/javase/tutorial/uiswing/painting/).Sie sollten 'update' oder' paint' nicht überschreiben, sondern über eine leichtgewichtige Komponente (wie 'JPanel') malen und die' paintComponent' Methode überschreiben – copeg

-1

In Ihrer Farbe Methode tun

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

besagt, dass diese Methode für Graphics nicht definiert ist. – vertigo

+0

@vertigo überprüfen aktualisierte Antwort. – HeroicO

+0

es aucually flimmerte es immer mehr – vertigo

1

nicht außer Kraft paint oder update. Die Lackierung sollte mit einer leichten Komponente erfolgen und die paintComponent Methode überschreiben. Beispiel:

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); 

Wenn Sie bei bestimmten Ereignistypen neu streichen möchten, rufen Sie Repaint für die Instanz auf. Beispiel: Innerhalb der Implementierung eines ActionListener:

Verwandte Themen