2

I've been making the game and want on component where I draw figures to add buttons. On this forum said I must call method "super.paint()" in method "paintComponent", but my programm works don't correct. I don't understand where I must call this method. May be I must use container. Thank you for help.

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;

}

The class for add component on frame

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 class

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

The class for processing from keyboard

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

} 
David Kroukamp
  • 36,155
  • 13
  • 81
  • 138
Andrew Valevskiy
  • 529
  • 3
  • 7
  • 18

1 Answers1

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

David Kroukamp
  • 36,155
  • 13
  • 81
  • 138
  • here - http://stackoverflow.com/questions/14038571/extends-from-jcomponent-and-class-jbutton Thank you for answer :)! But where (place in method paintComponent) I must write call method "super.paintComponent(g);" { drawer = (Graphics2D)graphics; DrawRectangles(drawer); drawer.setColor(Color.YELLOW); drawer.fill(pusherFoot); MoveFootRectangle(pusherFoot); drawer.setColor(Color.GREEN); drawer.fill(ball); MoveBall( ); super.paintComponent(drawer);/*where I must call it*/ } – Andrew Valevskiy Dec 26 '12 at 17:33
  • @AndrewValevskiy I see maybe a typo or just a shortening ... but It is meant to be `paintComponent` – David Kroukamp Dec 26 '12 at 17:36
  • @AndrewValevskiy see my update you must call it as the first call in overriden method – David Kroukamp Dec 26 '12 at 17:42
  • Thank you very much! Anyway my program doesn't work correct, I can't move figure. – Andrew Valevskiy Dec 26 '12 at 17:44
  • @AndrewValevskiy well is the `keyPressed` method of `KeyListener` getting called? I suspect not, have a look at my comment on Swing KeyBindings. See here for an example: http://stackoverflow.com/questions/13999506/threads-with-key-bindings/14001011#14001011 – David Kroukamp Dec 26 '12 at 17:46