2013-06-15 3 views
0

Я сделал игру pacman, и я хотел отобразить JFrame в качестве загрузочного файла самой игры. Итак, Iv'e сделал класс launcher.java extends JFrame, содержащий один JPanel, чтобы представить изображение игры.Как сохранить KeyListeners активным при переключении между JFrames

В другом классе под названием Game.java, который также расширяет JFrame Iv'e установил таймер и построил игру в графическом интерфейсе с помощью setVisible(false).

При активации игры пусковая установка показывает в течение трех секунд, а затем запускается таймер, и игра запускается, хотя keylisteners не отвечает.

Пожалуйста, помогите мне понять, почему.

Панель запуска Класс

package PacMan; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Launcher extends JFrame { 

    private static final long serialVersionUID = -7949539876450449197L; 

    private JPanel launchImage; 

    public Launcher() { 

     launchImage = new JPanel(); 
     launchImage.add(new JLabel(new ImageIcon("main.png"))); 
     launchImage.setVisible(true); 
     setUndecorated(true); 
     setSize(560,620); 
     setLocationRelativeTo(null); 
     getContentPane().add(launchImage); 
     setVisible(true); 

    } 
} 

package PacMan; 

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 

class Game extends JFrame implements MouseListener, KeyListener, ActionListener{ 

    private static final long serialVersionUID = -7132848196338970451L; 

    int posX=0,posY=0; 

    private Controller upper; 
    private JLabel[] lives; 
    public static Timer timer; 
    private int livesCounter, lifeIndex; 
    private JPanel livesPanel; 
    private double secondsSaver; 
    private Launcher launcher; 


    public Game() { 

     timer = new Timer(50,this); 

     JPanel gamePanel = new JPanel(); 
     gamePanel.setLayout(new BorderLayout()); 

     setUndecorated(true); 

     setSize(560,620); 
     setLocationRelativeTo(null); 


     this.upper = new Controller(); 
     this.addKeyListener(upper); 
     upper.setBorder(BorderFactory.createEmptyBorder(-5, -5, -5, -5)); 
     upper.setBounds(-5, -5, -5, -5); 


     JPanel lower = new JPanel(); 
     lower.setBackground(Color.BLACK); 
     lower.setLayout(new GridLayout(1,4)); 
     lower.setSize(560, 100); 

     JLabel livesLabel = new JLabel(new ImageIcon("lives.png")); 
     livesLabel.setHorizontalTextPosition(new Integer(0)); 
     lower.add(livesLabel); 

     livesPanel = new JPanel(); 
     livesPanel.setLayout(new GridLayout(1,3)); 
     lives = new JLabel[3]; 
     for(int i=0; i<3; i++){ 
      lives[i] = new JLabel(new ImageIcon("life.png")); 
      livesPanel.add(lives[i]); 
     } 
     livesPanel.setOpaque(false); 
     lower.add(livesPanel); 
     lifeIndex = 2; 
     livesCounter=3; 


     JButton restart = new JButton(new ImageIcon("Restart.png")); 
     restart.setBackground(Color.black); 
     restart.setBorderPainted(false); 
     lower.add(restart); 
     restart.addActionListener(new ActionListener() { // action for the quit button 
      public void actionPerformed(ActionEvent arg0) { 
       getContentPane().remove(upper); 
       upper = new Controller(); 
      } 
     }); 

     JButton quit = new JButton(new ImageIcon("quit.png")); 
     quit.setBackground(Color.black); 
     quit.setBorderPainted(false); 
     lower.add(quit); 
     quit.addActionListener(new ActionListener() { // action for the quit button 
      public void actionPerformed(ActionEvent arg0) { 
       System.exit(0);   
      } 
     }); 


     upper.getComponentListeners(); 


     gamePanel.add(upper, BorderLayout.NORTH); 
     gamePanel.add(lower, BorderLayout.SOUTH); 

     getContentPane().add(gamePanel); 
     pack(); 

     this.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       posX=e.getX(); 
       posY=e.getY(); 
      } 
     }); 

     this.addMouseMotionListener(new MouseAdapter() { 
      public void mouseDragged(MouseEvent evt) { 
       //sets frame position when mouse dragged    
       setLocation (evt.getXOnScreen()-posX,evt.getYOnScreen()-posY);   
      } 
     }); 

     timer.start(); 

     launcher = new Launcher(); 
    } 



    public Controller getController(){ 
     return upper; 
    } 

    public static void main(String args[]) { 
     new Game(); 
    } 


    @Override 
    public void mouseClicked(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 


    @Override 
    public void keyPressed(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 


    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 


    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     if (secondsSaver==3) { 
      this.setVisible(true); 
      launcher.setVisible(false); 
     } 
     if ((livesCounter>upper.getLives()) && (secondsSaver>=3)) { 
      lives[lifeIndex].setVisible(false); 
      lifeIndex--; 
     } 
     this.livesCounter=upper.getLives(); 
     secondsSaver+=0.05; 
    } 

} 
+0

может у подробную информацию о " keylisteners не отвечают "? –

ответ

2

Я рекомендую использовать KeyListener. У него есть особая проблема в том, что компонент, на который он зарегистрирован, должен быть не только фокусируемым, но и должен фокусироваться до того, как будут запущены ключевые события.

Вместо этого, я хотел бы предложить, используя Key Bindings API

Я также рекомендую вам сделать вызов requetsFocusInWindow в игровом кадре в пределах вашей actionListener при закрытии экрана загрузки

Смежные вопросы