2015-08-22 2 views
0

Я делаю своего рода игру в понг, но у меня есть проблема. У меня есть метод в моем коде, который проверяет, нажат ли пользовательский ввод. Но он не будет выполняться, когда я нажимаю (в моем случае) клавишу ВВЕРХ.Java-KeyEvent метод не работает

Это код, извините за плохой английский, пожалуйста, помогите мне:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class GamePanel extends JPanel implements ActionListener,KeyListener{ 
    Player player = new Player(); 
    Ball ball = new Ball(); 

    public GamePanel(){ 
     Timer time = new Timer(50, this); 
     time.start(); 
    } 

    private void update(){ 
     player.update(); 
     ball.update(); 
    } 

    public void paintComponent(Graphics g){ 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, 800, 600); 
     player.paint(g); 
     ball.paint(g); 
    } 
    public void actionPerformed(ActionEvent e){ 
     update(); 
     repaint(); 
    } 
    public void keyPressed(KeyEvent e){ 
     if(e.getKeyCode() == KeyEvent.VK_UP) 
     { 
      player.setyv(-5); 
     } 
    } 
    public void keyReleased(KeyEvent e){ 

    } 
    public void keyTyped(KeyEvent e){ 

    } 
} 
+2

Check [этот ответ] (http://stackoverflow.com/a/32046652/2775450), Вы имеете такую ​​же проблему в коде, а также. – Codebender

+3

@toskv: не имеет ничего общего с этим, и многое связано с требуемым фокусом KeyListener, а JPanel не является естественно фокусируемым и не сфокусированным. Лучше использовать привязки клавиш. –

+0

Да. :) KeyEvent находится в java.awt.event, поэтому его, конечно, не хватает. – toskv

ответ

1

Опять же,

  1. Использование Сочетания клавиш и не KeyListener, так как это может помочь вам принять фокус из изображение без использования kludges.
  2. Всегда обязательно вызовите метод paintComponent супер в пределах вашего переопределения.

Например:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class GamePanel extends JPanel implements ActionListener { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 600; 
    Player player = new Player(); 
    Ball ball = new Ball(); 

    public GamePanel() { 
     Timer time = new Timer(50, this); 
     time.start(); 

     // !! set key bindings 
     int condition = WHEN_IN_FOCUSED_WINDOW; 
     InputMap inputMap = getInputMap(condition); 
     ActionMap actionMap = getActionMap(); 

     KeyStroke up = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); 
     inputMap.put(up, up.toString()); 
     actionMap.put(up.toString(), new AbstractAction() { 

      @Override 
      public void actionPerformed(ActionEvent evt) { 
       player.setyv(-5); 
      } 
     }); 

     KeyStroke down = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0); 
     inputMap.put(down, down.toString()); 
     actionMap.put(down.toString(), new AbstractAction() { 

      @Override 
      public void actionPerformed(ActionEvent evt) { 
       player.setyv(5); 
      } 
     }); 
    } 

    private void update() { 
     player.update(); 
     ball.update(); 
    } 

    // !! public void paintComponent(Graphics g) { 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); // !! 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, PREF_W, PREF_H); // !! 
     player.paint(g); 
     ball.paint(g); 
    } 

    // !! 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    public void actionPerformed(ActionEvent e) { 
     update(); 
     repaint(); 
    } 

    // !! 
    private static void createAndShowGui() { 
     GamePanel mainPanel = new GamePanel(); 

     JFrame frame = new JFrame("GamePanel"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 

interface Playable { 
    void update(); 

    void paint(Graphics g); 
} 

class Player implements Playable { 
    private static final Color PLAYER_COLOR = Color.RED; 
    private static final Font FONT = new Font(Font.SANS_SERIF, Font.BOLD, 24); 
    private int x = 400; 
    private int y = 400; 
    private int yv = 0; 
    private int xv = 0; 

    @Override 
    public void update() { 
     y += yv; 
     x += xv; 
    } 

    public void setyv(int i) { 
     yv += i; 
    } 

    @Override 
    public void paint(Graphics g) { 
     g.setFont(FONT); 
     g.setColor(PLAYER_COLOR); 
     g.drawString("P", x, y); 
    } 

} 

class Ball implements Playable { 

    @Override 
    public void update() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void paint(Graphics g) { 
     // TODO Auto-generated method stub 

    } 

} 
+0

Я не очень разбирался в вашем коде ... Код, который я отправил, был из класса, основной класс и прочее были в других файлах ... Я исправил это и работает, так почему бы не использовать keylistener? – OpenGLmaster1992

+0

@HugoCornel: добавьте JButton в свою программу, что может украсть фокус и узнать - ваш KeyListener перестанет работать в этой ситуации, заставив вас создавать неестественные kludges, например, не позволяя кнопкам фокусироваться. –

+0

Почему я должен использовать кнопки в игре с понгами, мне нужен был только рабочий ответ на ввод пользователя (в этом случае ключом) – OpenGLmaster1992

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