2016-12-16 3 views
-1

Я изучаю, как сделать игру Pacman, поэтому я сделал JPanel и добавил на нее keyListener. Но я также хотел показать высокий балл и текущий балл, поэтому я добавил JFrame и поставил JPanel. Теперь игра не будет работать, хотя изображения загружаются. Я пробовал поиск самостоятельно, но это сложно, потому что я не знаю, как точно описать проблему.Игра становится невосприимчивой после добавления в JFrame

Вот код:

EDIT: Хорошо, так что я понятия не имею, почему, но когда я ставлю создание графического интерфейса в конце материала, а не игра снова работает. Может быть, это фокус, о котором вы, ребята, говорили? В любом случае, большое спасибо за вашу помощь!

/** 
* 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] или [Short, Self Contained, Correct Example] (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 НЕ является хорошим подходом. Если класс Board потеряет фокус, слушатель перестанет работать. Как уже упоминалось выше в комментариях к вашему вопросу, вы должны использовать 'Key Bindings'. – camickr