2

我一直在制作游戏,并希望在我绘制图形以添加按钮的组件上。在这个论坛上说我必须在方法“paintComponent”中调用方法“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;
       }

主班

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

} 
4

1 回答 1

2

On this forum said I must call method super.paint() in method paintComponent

Where did you get that from?

You should be calling super.paintComponent(g); in overridden paintComponent(..) like so:

@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( );
}
  • Also dont use KeyListener/KeyAdapter for Swing components rather use KeyBindings

  • Dont extend JFrame class unnecessarily

于 2012-12-26T17:31:44.027 回答