按键监听器不起作用

Max*_*sle 1 java swing keylistener key-bindings java-canvas

我正在编写一个类似炸弹人的游戏,但我的 KeyListener 有问题。

\n\n

问题是,当游戏运行时,KeyListener 不会响应,但是当它不运行时,它会执行我告诉他的操作。

\n\n

这是我的代码

\n\n
public class direction extends Canvas implements KeyListener {\n\nstatic float bmx = 35;\nstatic float bmy = 35;\nstatic float v = 0.03f;\n\npublic static BufferStrategy strategie;\npublic static BufferedImage image;\n\npublic direction()  {                                           //pas s\xc3\xbbr de ce que \xc3\xa7a fait\n    GraphicsEnvironment ge =                                    //on m\'a dit de le mettre           \n            GraphicsEnvironment.getLocalGraphicsEnvironment();  //le programme marche tr\xc3\xa8s bien sans\n    GraphicsDevice gd = ge.getDefaultScreenDevice();\n    GraphicsConfiguration gc = gd.getDefaultConfiguration();\n    image =  gc.createCompatibleImage(700,  700);\n    setSize(700, 700);\n\n}\n\n    static boolean gauche;\n    static boolean droite;\n    static boolean haut;\n    static boolean bas;\n\n\n    public void keyPressed(KeyEvent e) {\n\n        if (e.getKeyCode() == KeyEvent.VK_LEFT) {\n            gauche = true;\n        }\n        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {\n            droite = true;\n            System.out.println("lal");\n        }\n        if (e.getKeyCode() == KeyEvent.VK_DOWN) {\n            bas = true;\n        }\n        if (e.getKeyCode() == KeyEvent.VK_UP) {\n            haut = true;\n        }\n    }\n    public void keyReleased(KeyEvent e) {\n        if (e.getKeyCode() == KeyEvent.VK_LEFT) {\n            gauche = false;\n        }\n        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {\n            droite = false;\n        }\n        if (e.getKeyCode() == KeyEvent.VK_DOWN) {\n            bas = false;\n        }\n        if (e.getKeyCode() == KeyEvent.VK_UP) {\n            haut = false;\n        }\n    }\n    public void keyTyped(KeyEvent e) {\n    }\n\n\npublic static void draw(){\n\n    Graphics2D g = (Graphics2D) strategie.getDrawGraphics();\n\n    for(int ligne= 0 ; ligne < board.gridHauteur; ligne++){\n        for(int colonne= 0 ; colonne < board.gridLargeur ; colonne++){\n\n            switch (board.plateau1[ligne][colonne]) {\n            case 0 : g.setColor(Color.lightGray);\n            g.fillRect( 30*ligne, 30*colonne , 30, 30);\n            break;\n            case 1 : g.setColor(Color.black);              //dessine et donne la propri\xc3\xa9t\xc3\xa9 \'BLOCKED\' \xc3\xa0 certains bloques\n            g.fillRect( 30*ligne, 30*colonne , 30, 30);\n            board.plateau1[ligne][colonne] = board.BLOCKED;\n            break;\n            case 2 : g.setColor(Color.darkGray);\n            g.fillRect( 30*ligne, 30*colonne , 30, 30);\n            board.plateau1[ligne][colonne] = board.BLOCKED;\n            break;\n            }\n        }\n    }\n    g.setColor(Color.red);\n    g.fillRect((int)bmx, (int)bmy, 20, 20);   //dessine le "joueur"\n    strategie.show();\n}\n\npublic static void run() {\n\n    long dernierTempsLoop = System.currentTimeMillis();   // avec cette ligne, nous demandons un t0\n\n    while(true) {\n\n        long delta = (System.currentTimeMillis() - dernierTempsLoop); // puis, \xc3\xa0 chaque nouvel boucle\n        dernierTempsLoop = System.currentTimeMillis();               //nous calculons le temps que la \n                                                                    //boucle \xc3\xa0 mise pour s\'effectuer\n\n        for (int i=0;i<delta / 5;i++) {\n            logic(5);                   //permet d\'appeler \xc3\xa0 ce qu\'il y ait peu de mouvements si la boucle est rapide\n        }                               // et plus de mouvements si elle est plus lente ce qui garantit une vitesse constante\n                                        // quelle que soit le temps que la boucle met pour s\'effectuer\n        if ((delta % 5) != 0) {\n            logic(delta % 5);\n        }\n\n        draw();     //dessine le terrain et le rectangle\n\n        try { Thread.sleep(10); } catch (Exception e) {};   //permet au programme de ne pas "surchauffer"\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

}\n}

\n\n

然后

\n\n
public board()\n{\n    super("Bomberman");\n    setSize(fenLargeur,fenHauteur);\n    g = new direction();\n    g.setFocusable(true);\n\n    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n    getContentPane().setBackground(Color.BLACK);\n\n    JPanel content = new JPanel();\n    content.setLayout(new BorderLayout());\n    content.add(g, BorderLayout.CENTER);\n    g.addKeyListener(g);                            // <=== c\'est CA qui me pose probl\xc3\xa8me\n    setContentPane(content);\n    setVisible(true);\n\n\n    g.createBufferStrategy(2);\n    Bm.direction.strategie = g.getBufferStrategy();\n\n}`\n
Run Code Online (Sandbox Code Playgroud)\n\n

和...

\n\n
dispose();\n        board b = new board();\n        b.g.createBufferStrategy(2);\n        direction.strategie = b.g.getBufferStrategy();\n\n        direction.run();\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望我能理解,并感谢您的阅读。

\n

Mpp*_*ppl 6

我认为你的问题可能是在绘制完你可能需要做的所有事情之后:

g.setFocusable(true);
g.requestFocusInWindow();
Run Code Online (Sandbox Code Playgroud)

不仅 :

g.setFocusable(true);
Run Code Online (Sandbox Code Playgroud)