java - 屏幕更改后 Jpanel 不刷新

标签 java swing jpanel keylistener thread-sleep

我正在创建一个菜单,当我单击“开始”时链接到我的游戏。

 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) {

     }

 }

如您所见,点击播放将调用此 PlayGame.PlayGame();这将起作用,但它不会刷新,因此它将保留在菜单上,直到我最小化并打开或调整面板大小以强制其刷新。 有什么想法可以让它刷新吗?或者有什么问题导致它不刷新?

下面是调用 play 游戏方法的类。

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

一如既往地感谢您提出的任何帮助或想法, 谢谢!

最佳答案

你试过放

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

在调用 PlayGame(); 方法之后?

关于java - 屏幕更改后 Jpanel 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20128839/

相关文章:

java - 最小化时防止窗口重绘

java - 如何使轴的像素大小相等?

java - 将 JLabel 放置在指定位置并给出其坐标

c# - 无法理解如何在单元测试中使用 Mock

java - 解析文件并按属性对行进行排序

java - 如何将要注入(inject)的当前 Activity 传递给 Dagger2 中的对象

java - 我应该如何安装 JDateChooser?

java - 如何在 JTextField 中设置财务代码文档过滤器

java - 在 java 中的 JPanel 中显示 JFrame

java - 将另一个类的 JPanel 添加到 JFrame 中的 JPanel