Search code examples
javaswingjpanelkeylistenerthread-sleep

Jpanel not being refreshed after screen change


I am creating a menu that links to my game when I click play.

 package GameScreen;

 import java.awt.Graphics; import java.awt.Rectangle; import
 java.awt.event.MouseEvent; import java.awt.event.MouseListener; import
 javax.swing.ImageIcon; import javax.swing.JComponent;

 public class MainMenu  extends JComponent
         implements MouseListener 
{ 
 private GameScreen PlayGame; private ImageIcon bg = new
 ImageIcon(getClass().getResource("bg.jpg")); private ImageIcon
 ButtonPlay = new ImageIcon(getClass().getResource("button.jpg"));
 private ImageIcon ButtonOptions = new
 ImageIcon(getClass().getResource("button2.jpg")); private ImageIcon
 ButtonHS = new ImageIcon(getClass().getResource("button3.jpg"));
 private ImageIcon ButtonQuit = new
 ImageIcon(getClass().getResource("button4.jpg")); private Rectangle
 Boundsplay = new Rectangle (340, 250, 400, 100); private Rectangle
 BoundsOptions = new Rectangle (340, 350, 400, 100); private Rectangle
 BoundsHS = new Rectangle (340, 450, 400, 100); private Rectangle
 BoundsQuit = new Rectangle (340, 550, 400, 100);

     public MainMenu(GameScreen Play)
     {
         PlayGame = Play;
         setSize (1024,768);
     }

     public void paint(Graphics g)
     {
         g.drawImage(bg.getImage(), 0, 0, 1024, 768, null);        
         g.drawImage(ButtonPlay.getImage(), 340, 250, 400, 100, null);
         g.drawImage(ButtonOptions.getImage(),340, 350, 400, 100, null);
         g.drawImage(ButtonHS.getImage(),340, 450, 400, 100, null);
         g.drawImage(ButtonQuit.getImage(),340, 550, 400, 100, null);
         addMouseListener(this);
     }

     @Override
     public void mouseClicked(MouseEvent e) {

     }

     @Override
     public void mousePressed(MouseEvent e) {

     }

     @Override
     public void mouseReleased(MouseEvent e) {
     if(Boundsplay.contains(e.getX(), e.getY()))    {
                     PlayGame.PlayGame();
    }
     if(BoundsOptions.contains(e.getX(), e.getY()))     {
               System.out.println("hit options");   }
     if(BoundsHS.contains(e.getX(), e.getY()))  {
               System.out.println("hit HS");    }
     if(BoundsQuit.contains(e.getX(), e.getY()))    {
               System.out.println("hit Quit");  }

     }

     @Override
     public void mouseEntered(MouseEvent e) {

     }

     @Override
     public void mouseExited(MouseEvent e) {

     }

 }

As you can see hitting play will call this PlayGame.PlayGame(); and this will work however it will not refresh, so it will stay on the menu until I minimize and open or resize the panel to force it to refresh. Any ideas how I can get it to refresh? Or something that is wrong and causing it not to refresh?

Below is the class in which the play game method is called from.

package GameScreen;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;





public class GameScreen 
extends JFrame
implements Runnable, KeyListener
{
private Thread animation = new Thread(this);
private AniScreen aniscreen = new AniScreen();;
private MainMenu mainmenu = new MainMenu(this);;
private HighScores highscores = new HighScores();


public GameScreen()
{
   super("Zombie defense!");
   setBounds(20,20,1024,768);
   setContentPane (mainmenu);
   //setContentPane (highscores);
   animation.start();
   addKeyListener(this);
   setVisible (true);
   this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
}

public void PlayGame()
{
    setContentPane (aniscreen);

}

public static void main(String[] args)
   {
       GameScreen gs = new GameScreen();
   }

   @Override
   public void run()
   {
      while (true)
      {
            aniscreen.repaint();
            mainmenu.repaint();
            highscores.repaint();

         try
         {
            Thread.sleep(30);
         }
         catch(InterruptedException ex)
            {

            }
      }

   }

   @Override
   public void keyTyped(KeyEvent e)
   {
         }

   @Override
   public void keyPressed(KeyEvent e)
   {
      if (e.getKeyCode()==KeyEvent.VK_DOWN)
      {
        aniscreen.moveplayer(0,20);
      }
       if (e.getKeyCode()==KeyEvent.VK_UP)
      {
        aniscreen.moveplayer(0,-20);

      }

   }

   @Override
   public void keyReleased(KeyEvent e)
   {
      aniscreen.moveplayer(0,0);
   }
}

As always thanks for any help or ideas put forward, Thanks!


Solution

  • Have you tried putting

    panel.repaint();
    panel.revalidate();
    

    after you've invoked the PlayGame(); method?