2012-12-26 61 views
2

我一直在制作游戏,并希望在绘制图形的组件上添加按钮。在这个论坛上说我必须在方法“paintComponent”中调用方法“super.paint()”,但是我的程序工作不正确。我不明白我必须将这种方法称为何处。可能是我必须使用容器。谢谢你的帮助。哪里需要调用方法“super.paint()”

package mygame; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.RoundRectangle2D; 
import java.util.ArrayList; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class DrawPictures extends JComponent 
{ 
    static 
    { 
     flagLeft = true; 
     flagLeft = true;  
    } 

    public void setStringForMoveBall(String string) 
    { 
     stringForMoveBall = string; 
    } 

    public String getStringForMoveBall() 
    { 
     return stringForMoveBall; 
    } 

    public DrawPictures() 
    { 
     start = new JButton("Start game"); 
     stop = new JButton("Stop game"); 
     changeColorBall = 0; 
     stringForMoveBall = ""; 
     this.offset = 8; 
     marginBetweenRectangles = 70; 
     height = radiusWidth = 50; 
     top = radiusHeight = 30; 
     width = 60; 
     left = 20; 
     this.counter = 11; 
     rectangles = new ArrayList<RoundRectangle2D>(); 
     ball = new Ellipse2D.Double(400,570,top, top); 
     FullCollection(rectangles); 
     pusherFoot = new RoundRectangle2D.Double(350, 600, 150, 50,radiusWidth,radiusHeight); 
     panel = new JPanel(); 
     panel.add(stop); 
     panel.add(start); 
     add(panel);   
     timerForBall = new Timer(40, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) 
      { 

       repaint(); 
      } 
     }); 
     timerForBall.start(); 
    } 

    private void DrawRectangles(Graphics2D drawer) 
    { 

      for(int i = 0; i != rectangles.size(); ++i) 
      { 
       if (i % 4 == 0) 
       { 
        drawer.setColor(Color.RED); 
        drawer.fill(rectangles.get(i)); 
       } 
       else if (i % 3 == 0) 
       { 
        drawer.setColor(Color.CYAN); 
        drawer.fill(rectangles.get(i)); 
       } 
       else if (i % 5 == 0) 
       { 
        drawer.setColor(Color.YELLOW); 
        drawer.fill(rectangles.get(i)); 
       } 
       else if (i % 7 == 0) 
       { 
        drawer.setColor(Color.WHITE); 
        drawer.fill(rectangles.get(i)); 
       } 
       else if (i % 8 == 0) 
       { 
        drawer.setColor(Color.MAGENTA); 
        drawer.fill(rectangles.get(i)); 
       } 
       else if (i % 9 == 0) 
       { 
        drawer.setColor(Color.GREEN); 
        drawer.fill(rectangles.get(i)); 
       } 

       else 
       { 
        drawer.setColor(Color.ORANGE); 
        drawer.fill(rectangles.get(i)); 
       } 
     } 
    } 

    @Override protected void paintComponent(Graphics graphics) 
    { 

     drawer = (Graphics2D)graphics; 
     DrawRectangles(drawer); 
     super.paint(graphics);/*where I must call it*/ 
     drawer.setColor(Color.YELLOW); 
     drawer.fill(pusherFoot); 
     MoveFootRectangle(pusherFoot); 
     drawer.setColor(Color.GREEN); 
     drawer.fill(ball); 
     MoveBall(); 

    }   

    private void CheckHitBallWithRectangles() 
    {  
     for(int i = rectangles.size() - 1; i > 0; --i) 
     { 
      if(ball.getMinY() >= rectangles.get(i).getMinY() && 
       ball.getMinY() <= rectangles.get(i).getMaxY() && 
       ball.getMaxX() >= rectangles.get(i).getMinX() && 
       ball.getMaxX() <= rectangles.get(i).getMaxX()) 
      { 
       if (CompareStringsForMoveBall("")) 
       { 
        stringForMoveBall = "DownAndLeftFromTopSide"; 
        rectangles.remove(i); 
        --i; 
       } 
       if(CompareStringsForMoveBall("UpAndRightFromLeftSide")) 
       { 
        stringForMoveBall = "DownAndRightFromTopSide"; 
        rectangles.remove(i); 
        --i; 
       } 
      } 
      if( ball.getMinY() >= rectangles.get(i).getMinY() && 
        ball.getMinY() <= rectangles.get(i).getMaxY() && 
        ball.getMinX() >= rectangles.get(i).getMinX() && 
        ball.getMinX() <= rectangles.get(i).getMaxX()) 
      { 
       if (CompareStringsForMoveBall("")) 
       { 
        stringForMoveBall = "DownAndLeftFromTopSide"; 
        rectangles.remove(i); 
        --i; 
       } 
      } 

      if (ball.getMaxY() >= rectangles.get(i).getMinY() && 
      ball.getMaxY() <= rectangles.get(i).getMaxY() && 
      ball.getMaxX() >= rectangles.get(i).getMinX() && 
      ball.getMaxX() <= rectangles.get(i).getMaxX()) 
      { 
       if(CompareStringsForMoveBall("DownAndRightFromTopSide")) 
       { 
        stringForMoveBall = "DownAndLeftFromTopSide"; 
        rectangles.remove(i); 
        --i; 
       } 
       if(CompareStringsForMoveBall("UpAndRightFromLeftSide")) 
       { 
        stringForMoveBall = "DownAndRightFromTopSide"; 
        rectangles.remove(i); 
        --i; 
       } 
      } 
      if (ball.getMinX() >= rectangles.get(i).getMinX() && 
       ball.getMinX() <= rectangles.get(i).getMaxX()&& 
       ball.getMinY() >= rectangles.get(i).getMinY() && 
       ball.getMinY() <= rectangles.get(i).getMaxY()) 
      { 
       rectangles.remove(i); 
       --i; 
      }   
     } 
    }  
    private void MoveFootRectangle(RoundRectangle2D pusher) 
    { 

      if(flagLeft && pusher.getX() >= 0) 
      { 
       pusher.setFrame(pusher.getX() - 30, pusher.getY(), 150, 60); 
       flagLeft = false; 
      } 
      if(flagRight && pusher.getX() <= 730) 
      { 
       pusher.setFrame(pusher.getX() + 30, pusher.getY(), 150, 60); 
       flagRight = false;     
      } 

    } 

    public static void SetStatusFlagLeft() 
    { 
     flagLeft = true; 
    } 
    public static void SetStatusFlagRight() 
    { 
     flagRight = true; 
    } 
    private void MoveBallYLessNull() 
    { 
     if(CompareStringsForMoveBall("")) 
     { 
      stringForMoveBall = "DownAndLeftFromTopSide";    
     } 
     else if(CompareStringsForMoveBall("UpAndRightFromLeftSide")) 
     { 
      stringForMoveBall = "DownAndRightFromTopSide"; 
     } 
    } 
    private void MoveBallXLessNull() 
    { 
     if ( CompareStringsForMoveBall("DownAndLeftFromTopSide")) 
     { 
      stringForMoveBall = "DownAndRightFromTopSide"; 
     } 
     else if(stringForMoveBall.compareTo("") == 0) 
     { 
     stringForMoveBall = "UpAndRightFromLeftSide"; 
     } 
    } 

    private void MoveBall() 
    {  
     if (CompareStringsForMoveBall("")) 
     { 
      ball.setFrame(ball.getX() - offset, ball.getY() - offset, top, top); 
     } 
     if (CompareStringsForMoveBall("DownAndLeftFromTopSide")) 
     { 
      ball.setFrame(ball.getX() - offset, ball.getY() + offset, top, top); 
     } 

     if(ball.getX() < 0 ) 
     { 
      MoveBallXLessNull();    
     } 
     if(ball.getY() < 0) 
     { 
      MoveBallYLessNull();    
     } 
     if (CompareStringsForMoveBall("UpAndRightFromLeftSide")) 
     { 
      ball.setFrame(ball.getX() + offset, ball.getY() - offset, top, top); 
     } 

     if (CompareStringsForMoveBall("DownAndRightFromTopSide")) 
     { 
      ball.setFrame(ball.getX() + offset, ball.getY() + offset, top, top); 
     } 

     if (ball.getMaxY() == pusherFoot.getMinY() && 
       ball.getCenterX() > pusherFoot.getMinX() 
      && ball.getCenterX() < pusherFoot.getMaxX()) 
     { 
      MoveBallHitWithFoot(); 
     } 

     if(ball.getMaxX() > 880) 
     { 
      MoveBallForXMoreWidth(); 
     } 

     CheckHitBallWithRectangles(); 
    } 

    public void MoveBallForXMoreWidth() 
    { 
     if (CompareStringsForMoveBall("DownAndRightFromTopSide")) 
     { 
      setStringForMoveBall("DownAndLeftFromTopSide"); 
     } 
     else if(CompareStringsForMoveBall("UpAndRightFromLeftSide")) 
     { 
      setStringForMoveBall("");    
     } 
    } 

    public void MoveBallHitWithFoot() 
    { 
     if (CompareStringsForMoveBall("DownAndRightFromTopSide")) 
     { 
      setStringForMoveBall("UpAndRightFromLeftSide") ; 
     } 
     else if (CompareStringsForMoveBall("DownAndLeftFromTopSide")) 
     { 
      setStringForMoveBall(""); 
     } 
    } 
    public boolean CompareStringsForMoveBall(String moveforball) 
    { 
     if ((getStringForMoveBall()).compareTo(moveforball) == 0) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    private void FullCollection(ArrayList<RoundRectangle2D> newrectangles) 
    { 
     int counterTop = 0; 

     for(int i = 0; i <= counter; ++i) 
     { 
      newrectangles.add(new RoundRectangle2D.Double 
       (top + counterTop,left,width,height,radiusWidth,radiusHeight)); 
      counterTop += marginBetweenRectangles; 
     } 

     counterTop = 0; 

     for(int i = 0; i <= counter; ++i) 
     { 
      newrectangles.add(new RoundRectangle2D.Double 
      (top + counterTop,left + marginBetweenRectangles,width,height,radiusWidth,radiusHeight)); 
      counterTop += marginBetweenRectangles; 
     } 

     counterTop = 0; 

     for(int i = 0; i <= counter; ++i) 
     { 
      newrectangles.add(new RoundRectangle2D.Double 
      (top + counterTop,left + marginBetweenRectangles * 2,width,height,radiusWidth,radiusHeight)); 
      counterTop += marginBetweenRectangles; 
     } 

    } 
    private ArrayList<RoundRectangle2D> rectangles; 
    private Ellipse2D ball; 
    private int width,left,top,height, counter,radiusWidth, 
      radiusHeight,marginBetweenRectangles,offset,changeColorBall; 
    private RoundRectangle2D pusherFoot; 
    private Timer timerForBall; 
    private static boolean flagLeft,flagRight; 
    private String stringForMoveBall; 
    private Graphics2D drawer; 
    private JButton start,stop; 
    private JPanel panel; 

} 

对帧附加部件

package mygame; 

import javax.swing.JFrame; 

public class FrameForGame extends JFrame 
{ 
    public FrameForGame() 
    { 
     setTitle("MyGame"); 
     setSize(WIDTH_H, HEIGHT_H); 
     setLocation(150, 50); 
     DrawPictures pictures = new DrawPictures(); 
     event = new ForEvents(); 
     addKeyListener(event); 
     add(pictures); 
    } 
    private int WIDTH_H = 1200; 
    private int HEIGHT_H = 700; 
    private ForEvents event; 
     } 

Main类

package mygame; 

import java.awt.EventQueue; 
import javax.swing.JFrame; 

    public class MyGame { 

     /** 
     * @param args the command line arguments 
     */ 
     public static void main(String[] args) 
     { 
      EventQueue.invokeLater(new Runnable() { 

       @Override 
       public void run() 
       { 
        FrameForGame button = new FrameForGame(); 
        button.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        button.setVisible(true); 
       } 
      }); 
     } 
    } 

类从键盘的类进行处理

package mygame; 

import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JOptionPane; 

/** 
* 
* @author TNV 
*/ 
public class ForEvents extends KeyAdapter implements KeyListener 

{ 

    @Override 
    public void keyPressed(KeyEvent ke) 
    { 
     if(ke.getKeyCode() == KeyEvent.VK_LEFT) 
     { 
      //JOptionPane.showMessageDialog(null, "Hello"); 
      DrawPictures.SetStatusFlagLeft(); 
     } 
     if(ke.getKeyCode() == KeyEvent.VK_RIGHT) 
     { 
      DrawPictures.SetStatusFlagRight(); 
     } 
    } 

} 

回答

2

在这个论坛上说我必须调用方法super.paint()的方法 paintComponent

你从哪里弄来从?

你应该重写paintComponent(..)被调用super.paintComponent(g);像这样:

@Override 
protected void paintComponent(Graphics graphics) 
{ 
    super.paintComponent(graphics); 

    //do other drawings here 

    drawer = (Graphics2D)graphics; 
    DrawRectangles(drawer); 
    drawer.setColor(Color.YELLOW); 
    drawer.fill(pusherFoot); 
    MoveFootRectangle(pusherFoot); 
    drawer.setColor(Color.GREEN); 
    drawer.fill(ball); 
    MoveBall(); 
} 
  • 而且不使用KeyListener/KeyAdapter Swing组件,而使用KeyBindings

  • 不要延长JFrame类不必要

+0

here - http://stackoverflow.com/questions/14038571/extends-from-jcomponent-and-class-jbutton 谢谢你的回答:)!但是在哪里(在方法paintComponent中)我必须编写调用方法“super.paintComponent(g);” 抽屉=(Graphics2D)图形; DrawRectangles(drawer); drawer.setColor(Color.YELLOW); drawer.fill(pusherFoot); MoveFootRectangle(pusherFoot); drawer.setColor(Color.GREEN); drawer.fill(ball); MoveBall(); super.paintComponent(抽屉);/*我必须称之为*/ } –

+0

@AndrewValevskiy我看到也许是一个错字或只是一个缩短...但它是为了'paintComponent' –

+0

@AndrewValevskiy看到我的更新你必须将其视为第一次调用覆盖方法 –