2016-12-16 96 views
-1

我正在学习如何制作Pacman游戏,因此我创建了一个JPanel并在其上添加了一个keyListener。但我也想显示高分和当前分数,所以我添加了一个JFrame并将JPanel放在那里。现在游戏不会运行,尽管图像确实会加载。我尝试过自己搜索,但很难,因为我不知道如何完全描述问题。添加到JFrame后,游戏变得无响应

下面是代码:

编辑:好的,所以我不知道为什么,但是当我把东西在年底建立GUI,而不是游戏再次工作。也许这是你们谈论的焦点?无论如何,非常感谢您的帮助!

/** 
* This class creates a PacMan GUI that extends the JFrame class. It has a Board (JPanel) and 
* includes a constructor method that sets up the frame and adds a key listener to the board. 
*/ 
import java.awt.*; 
import javax.swing.*; 
@SuppressWarnings("serial") //takes away yellow lines 

public class PacManGUI extends JFrame { 

    // Board panel 
    private Board board = new Board(); 
    JLabel currentScoreLabel = new JLabel("Score: " + Board.score); 
    JLabel highScoreLabel = new JLabel("High Score: " + Board.highScore + " by " + Board.initials); 

    /** 
    * PacMan GUI constructor 
    * @param selectedTheme 
    */ 
    public PacManGUI(String selectedTheme) { 

     //1. Setup the GUI 
     setSize(620, 675); 
     setTitle("PacMan"); 
     getContentPane().setBackground(Color.BLACK); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //removes the java icons that pop up when running 

     add(currentScoreLabel, BorderLayout.PAGE_START); 
     currentScoreLabel.setForeground(Color.WHITE); 

     add(highScoreLabel, BorderLayout.PAGE_END); 
     highScoreLabel.setForeground(Color.WHITE); 

     //2. Listen for events on the board and add the board to the GUI 
     add(board); 
     addKeyListener(board); 
     board.setFocusable(true); 

     //3. Make GUI visible 
     setVisible(true); 
    } 
} 
+0

你的程序的其余部分在哪里? – gpasch

+0

我不知道是否应该发布我的整个程序,因为它里面有几个类。当我将板子连接到JFrame时,我只有这个问题,所以我只发布了这个类。 – CreamLover123

+0

*“我不确定我是否应该发布我的整个程序,”*不,但不是不可编译的代码片断。为了尽快提供更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 *“所以我添加了一个JFrame并将JPanel放在那里,现在游戏不会运行”*您以前看到它运行的是哪个? –

回答

1

Swing通过使用布局管理器工作。 JFrame的默认布局管理器是BorderLayout。阅读教程以了解BorderLayout的工作原理。

让布局管理器完成工作并摆脱所有setBounds(...)逻辑。

wall.add(board); 
//board.setVisible(true); 
addKeyListener(board); 
board.setFocusable(true); 
//currentScore.setBounds(0,0,100,50); 
wall.add(currentScore); 

所以在上面的代码中你想两个组件添加到墙的BorderLayout.CENTER。 (请注意,如果您未指定约束条件,则默认为CENTER)。这将不起作用,因为只有一个组件可以显示在CENTER中,因此只有最后添加的内容才可见。

相反,你可以尝试:

wall.add(currentScore, BorderLayout.PAGE_START); 

另外,你的类的基础是错误的。 PacManGUI“是一个”JFrame,因此不需要在构造函数中创建第二个框架。看看教程目录。还有一个关于How to Make Frames的部分让你开始。

+0

哇,我的代码变得更短了,谢谢! – CreamLover123

+0

但是,当我点击我的箭头键时,主板仍然不响应。 keyListener有问题吗?我已经更新了我的代码。 – CreamLover123

+0

仅将KeyEvents分派给具有焦点的组件。您应该将KeyListener添加到Board类的构造函数中。另外,你应该让构造函数中的Board类成为可聚焦的。但是使用KeyListener不是一个好方法。如果理事会班级失去焦点,那么听众将停止工作。正如上面在你的问题的评论中提到的,你应该使用'键绑定'。 – camickr