java - 为什么 Key Listener 仅有时起作用

标签 java actionlistener keylistener

这是我的代码。我实现了 keyListener 和 actionListener。我能够更改面板的坐标,以便它可以向左或向右移动。但我注意到 keyListener 的焦点不太好。我必须一次又一次地关闭并重新运行该应用程序才能使其正常工作并且我能够控制它。我听说过 keyBidings 但我不太了解它。如何实现 keyBindings 以使键盘响应更容易聚焦?

 package brickBreaker;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.Timer;

import javax.swing.JPanel;

public class game extends JPanel implements KeyListener, ActionListener {
    private Timer timer;
    private boolean play = false;
    private int playerx = 650;
    private int ballx=900, bally=500,ballxdir=-1,ballydir=-2;
    int delay =8;
    public game() {
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        timer = new Timer(delay, this);
        timer.start();

    }


    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(1, 1, 1500 ,950);

        // user panel
        g.setColor(Color.CYAN);
        g.fillRect(playerx, 900, 250, 15);

        //ball
        g.setColor(Color.GREEN);
        g.fillOval(ballx, bally, 30, 30);

        g.dispose();
    }



    public void right() {
        play = true;
        playerx += 20;
    }
    public void left() {
        play = true;
        playerx -=20;
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if(key ==KeyEvent.VK_LEFT) {
            System.out.print("Left\n");
            left();
        }if (key == KeyEvent.VK_RIGHT) {
            System.out.print("Right\n");
            right();
        }



    }

    @Override
    public void keyReleased(KeyEvent arg0) {


    }

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

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        timer.start();
        if (play) {

            ballx +=ballxdir;
            bally +=ballydir;
            if (ballx <0) {
                ballxdir =-ballxdir;
            }
            if (bally <0) {
                ballydir =-ballydir;
            }
            if (ballx <1000) {
                ballxdir =-ballxdir;
            }




        }
        repaint();

    }

}

最佳答案

很抱歉回答太晚了,但我想我已经解决了您的问题。

你是对的 - 你需要一次又一次地打开和关闭 JPanel,然后它才能工作。但问题是:JPanel 不断失去焦点。所以你所要做的就是添加:

requestFocus(true);

paint() 方法,如下所示:

public void paint(Graphics g) {
    requestFocus(true);
    g.setColor(Color.BLACK);
    g.fillRect(1, 1, 1500 ,950);

    // user panel
    g.setColor(Color.CYAN);
    g.fillRect(playerx, 900, 250, 15);

    //ball
    g.setColor(Color.GREEN);
    g.fillOval(ballx, bally, 30, 30);

    g.dispose();
}

程序运行正常!

关于java - 为什么 Key Listener 仅有时起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49570291/

相关文章:

java - MainPanel 不监听嵌套 JPanel 内的 KeyBinding

java - 在 Java 中使用 KeyListener

java - 禁用布局内的所有 subview

java - Hibernate 是否需要 Java EE

java - 在Java中读取图像文件

java - 对文本字段中输入的 8 个和 4 个字符执行不同的操作

java - java 小程序错误

java - ProGuard 警告 : there were 7 unresolved references to program class members

java - Actionlistener 将 Jlist 信息输出到文本区域

java - "Windows key"+ "other key"- Java 没有 't detect "其他 key ”