【问题标题】:Why does Key Listener only sometimes work为什么 Key Listener 有时只能工作
【发布时间】:2018-03-30 07:31:30
【问题描述】:

这是我的代码。我实现了 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();

    }

}

【问题讨论】:

    标签: java actionlistener keylistener


    【解决方案1】:

    很抱歉非常迟到了,但我想我已经解决了你的问题。

    您是对的 - 您需要在 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();
    }
    

    程序运行正常!

    【讨论】:

    • 如此简单……如此优雅。谢谢。
    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    相关资源
    最近更新 更多