Java XP和7中的重点Windows

Java XP和7中的重点Windows,java,swing,windows-7,keylistener,Java,Swing,Windows 7,Keylistener,我正在玩一个简单的乒乓球游戏。当用户按下空格键时,游戏开始。在WindowsXP中工作得很好,但在Windows7中却变得很奇怪。如果按空格键,然后单击游戏窗口,它将运行。如果你先点击,然后点击空格,什么都没有。我已经在下面粘贴了主类 public class Game extends JPanel { static final int FW = 400; static final int FH = 300; Ball ball = new Ball(this); Paddle paddl

我正在玩一个简单的乒乓球游戏。当用户按下空格键时,游戏开始。在WindowsXP中工作得很好,但在Windows7中却变得很奇怪。如果按空格键,然后单击游戏窗口,它将运行。如果你先点击,然后点击空格,什么都没有。我已经在下面粘贴了主类

 public class Game extends JPanel {

static final int FW = 400;
static final int FH = 300;

Ball ball = new Ball(this);
Paddle paddleL = new Paddle(this);
PaddleAI paddleR = new PaddleAI(this);
public static boolean go;
static KeyListener key;


public Game(){
   setFocusable(true);
   addKeyListener(key = new KeyListener(){
       @Override
        public void keyTyped(KeyEvent e){

       }
       @Override
        public void keyReleased(KeyEvent e){
           paddleL.keyReleased(e);
           if(e.getKeyCode() == KeyEvent.VK_SPACE)
               go = true;
       }
       @Override
       public void keyPressed(KeyEvent e){
           paddleL.keyPressed(e);
           if(e.getKeyCode()==KeyEvent.VK_SPACE)
               go = true;
       }
   });


 }


void setup(){
   ball.setup();
   paddleL.setup();
   paddleR.setup();
}

void move(){
    ball.move();
    paddleL.move();
    paddleR.move();
}


public void paint(Graphics g){
    super.paint(g);
    ball.paint(g);
    paddleL.paint(g);
    paddleR.paint(g);
}

public static void main(String[] args) throws InterruptedException{

    //final int FW = 400;
   // final int FH = 300;

    JFrame frame = new JFrame();
    Game game = new Game();

    game.setBackground(Color.black);
    frame.add(game);
    frame.getContentPane().setBackground(Color.cyan);
    frame.setBackground(Color.black);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(FW, FH);
    frame.setLocationRelativeTo(null);
    frame.setTitle("Pong");
    frame.setResizable(true);
    frame.setVisible(true);


   game.setup();

    while(true){

        if(go){
            game.move();
            game.repaint();
            Thread.sleep(10);
        }

    }
}

}

您将希望使用键绑定而不是键侦听器。KeyListener对关注的组件非常挑剔,这正是您遇到的问题。下面是一个如何使用的快速示例:

请参见:1)建议最终使用2)您不应重写
paint()
方法,而应重写
paintComponent()
import java.awt.event.*;
import javax.swing.*;

public class KeyBindings extends Box{
    public KeyBindings(){
        super(BoxLayout.Y_AXIS);
        final JTextPane textArea = new JTextPane();
        textArea.insertComponent(new JLabel("Text"));
        add(textArea);

        Action action = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.setText("New Text");
            }};
         String keyStrokeAndKey = "control SPACE";
         KeyStroke keyStroke = KeyStroke.getKeyStroke(keyStrokeAndKey);
         textArea.getInputMap().put(keyStroke, keyStrokeAndKey);
         textArea.getActionMap().put(keyStrokeAndKey, action);
    }


    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new KeyBindings());
        frame.pack();
        frame.setVisible(true);
    }
}