2015-05-08 130 views
0

所以我試圖做一個彈球遊戲作爲一個小程序加載到JFrame。該小程序加載到它沒有問題,但是當我運行它閃爍和毛刺。提前致謝!JFrame圖形故障中的Java applet?

JFrame類:

import javax.swing.*; 
import java.awt.*; 
import java.applet.*; 
public class PinBallGUI extends JFrame 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("Pinball"); 
     frame.setVisible(true); 
     frame.setSize(600,700); 
     int height = 700; 
     int width = 600; 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     PinBallGame temp = new PinBallGame(); 
     frame.add(temp); 
     temp.init(width,height); 
     temp.start(); 
     temp.run(); 
    } 
} 

Applet類:

import java.awt.*; 
import javax.swing.*; 
import java.applet.*; 
import java.util.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 
public class PinBallGame extends Applet implements Runnable 
{  
    Thread runner; 
    private Image Buffer; 
    private Graphics gBuffer; 
    int width,height; 
    PinBallBall B1; 
    PinBallPaddle P1,P2; 
    PinBallRectangle R1,R2,R3,R4; 
    PinBallRectangle[] rArray; 
    boolean leftKey; 
    boolean rightKey; 
    boolean downKey; 
    boolean spaceKey; 
    int points; 
    Random gen = new Random(); 
    public void init(int W,int H) 
    { 
     width=W; 
     height=H; 
     Buffer=createImage(width,height); 
     gBuffer=Buffer.getGraphics(); 
     B1 = new PinBallBall(-1,width-57,645); 
     P1 = new PinBallPaddle(180,625,255,640); 
     P2 = new PinBallPaddle(300,640,375,625); 
     R1 = new PinBallRectangle(1,width-35,60,15,600); 
     R2 = new PinBallRectangle(1,width-80,60,15,600); 
     R3 = new PinBallRectangle(1,0,625,180,40); 
     R4 = new PinBallRectangle(1,375,625,140,40); 
     rArray = new PinBallRectangle[5]; 
     for(int i=0; i<rArray.length; i++) 
     { 
      rArray[i] = new  PinBallRectangle(-1,gen.nextInt(450),gen.nextInt(450),gen.nextInt(60),gen.nextInt(60)); 
     } 
     int count = 0; 
     addKeyListener(new MyKeyListener()); 
     points = 0; 
    } 
    private class MyKeyListener extends KeyAdapter 
    { 
     public void keyPressed(KeyEvent e) 
     { 
      switch(e.getKeyCode()) 
      { 
       case KeyEvent.VK_LEFT: 
       leftKey = true; 
       break; 
       case KeyEvent.VK_RIGHT: 
       rightKey = true; 
       break; 
       case KeyEvent.VK_SPACE: 
       spaceKey = true; 
       break; 
       case KeyEvent.VK_DOWN: 
       downKey = true; 
       break; 
      } 
     } 
     public void keyReleased(KeyEvent e) 
     { 
      switch(e.getKeyCode()) 
      { 
       case KeyEvent.VK_LEFT: 
       leftKey = false; 
       break; 
       case KeyEvent.VK_RIGHT: 
       rightKey = false; 
       break; 
       case KeyEvent.VK_SPACE: 
       spaceKey = false; 
       break; 
       case KeyEvent.VK_DOWN: 
       downKey = false; 
       break; 
      } 
     } 
    } 
    public void start() 
    { 
     if (runner == null) 
     { 
      runner = new Thread (this); 
      runner.start(); 
     } 
    } 
    public void stop() 
    { 
     runner = null; 
    } 
    public void run() 
    { 
     while(true) 
     { 
      update(gBuffer); 
      if(leftKey){P1.moveLeftPaddle();} 
      if(rightKey){P2.moveRightPaddle();} 
      if(downKey){B1.launchBall(width,height);} 
      repaint(); 
      try {runner.sleep(25);} 
      catch (Exception e) { } 
      repaint(); 
      gBuffer.setColor(Color.black); 
      gBuffer.fillRect(0,0,width,height); 
      if((B1.getX() != width-57)||(B1.getY() != 645)) 
      { 
       B1.movePinBallBall(width,height); 
       B1.update(); 
      } 
      R1.ballCollision(B1); 
      repaint(); 
      R2.ballCollision(B1); 
      repaint(); 
      R3.ballCollision(B1); 
      repaint(); 
      R4.ballCollision(B1); 
      repaint(); 
      P1.ballCollision(B1); 
      repaint(); 
      P2.ballCollision(B1); 
      repaint(); 
      for(int i=0; i<rArray.length; i++) 
      { 
       rArray[i].ballCollision(B1); 
       repaint(); 
      } 
      for(int i=0; i<rArray.length; i++) 
      { 
       rArray[i].paint(gBuffer); 
      } 
      update(gBuffer); 
      B1.paint(gBuffer); 
      R1.paint(gBuffer); 
      R2.paint(gBuffer); 
      R3.paint(gBuffer); 
      R4.paint(gBuffer); 
      P1.paint(gBuffer); 
      P2.paint(gBuffer); 
      repaint(); 
      update(gBuffer); 
     }//while(true) 
    } //run  
    public void update(Graphics g) 
    { 
     paint(g); 
    } 
    public void paint(Graphics g) 
    { 
     g.drawImage(Buffer,0,0, this); 
    } 
} 

我也有其他的3類,只是對於對象(球,矩形,槳法)。 再次提前致謝!

+1

加載到JFrame中的Applet - 您爲什麼要這麼做? –

+1

您正在混合重量輕和重量輕的組件,它看起來永遠不會結束 – MadProgrammer

+0

1)爲什麼要編寫一個小程序?如果是由於老師指定它,請將它們轉介給[爲什麼CS教師應該**停止**教Java applets](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop教學-java的小應用程序/)。 2)爲什麼使用AWT?看到[這個答案](http://stackoverflow.com/questions/6255106/java-gui-listeners-without-awt/6255978#6255978)有很多很好的理由放棄AWT使用組件有利於Swing。 –

回答

0

您將要使用JFrame和JPanel或者Frame和Canvas,而不是使用JFrame和Applet。你絕對可以混合和匹配組件,但如果你不這樣做,你可能會遇到更少的錯誤。

當你不使用雙緩衝時,我通常會發現閃爍發生。來一個JPanel,你需要啓用雙緩衝,而對於Canvas,如果你真的需要的話,有一種方法可以實現三重緩衝,但是在絕大多數情況下堅持使用JPanel。