繁体   English   中英

ActionListener和KeyListener根本不起作用

[英]ActionListener and KeyListener not working at all

package Objects;

import javax.swing.JPanel;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;



public class PowerBar extends JPanel implements ActionListener, KeyListener {

private double x;
private final double y = 420;
private double xv = 0;
private final int width, height;
private boolean left = false, right = false;
private Timer t = new Timer(5, this);

public PowerBar(JPanel j) {
    width = j.getWidth();
    height = j.getHeight();
    x = 180;

    t.start();
    this.addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);

  }

  public void move() {

  }

  public void powerbarPosition() {

  }

  @Override
  public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    Rectangle2D rect = new Rectangle2D.Double(x, y, 100, 15);
    g2.setColor(Color.DARK_GRAY);
    g2.fill(rect);
  }

  @Override
  public void actionPerformed(ActionEvent ae) {
    x += xv;
    repaint();
  }

  @Override
  public void keyPressed(KeyEvent ev) {
    if (ev.getKeyCode() == KeyEvent.VK_LEFT) {
        left = !left;
        if (left == true) {
            xv = -2;
        } else if (ev.getKeyCode() == KeyEvent.VK_RIGHT) {
            right = !right;
            if (right == true) {
                xv = 2;
            }
        }
      }
    }

    @Override
    public void keyReleased(KeyEvent ev) {

    }

    @Override
    public void keyTyped(KeyEvent ke) {

    }

    }

我对编程有点陌生,这是我第一次编程。 我试图用左键和右键移动电源条,但是按下这些键时没有响应。 电源条在一个名为DrawMain的单独类中绘制,该类使用paintComponent方法。

  1. JPanel不监听Action ,它是一个容器而不是控制器。 因此,它没有addActionListener(actionListener)函数。
  2. 要收听按键事件,释放,释放等,目标组件必须具有焦点。 但是,您可以根据需要在目标组件上调用requestFocusInWindow()以获取焦点。
  3. 最好不要对不监听此类的类实现一个监听器,在您的上下文中为ActionListener 利用内联匿名类或声明另一个实现ActionListener
  4. 正如@AndrewThompson和stackoverflow的其他一些摇摆演出所建议的那样,最好将Key绑定(使用键输入映射和动作输入映射)使用到更高级别实现的组件。 尽量避免使用较低级别的AWT实现KeyListener

检查官方教程页面:

  1. 如何使用按键绑定
  2. 如何编写密钥侦听器
  3. 如何编写动作监听器

1)您的ActionListener未附加到JPanel及其上的组件,因为它不起作用。

2)不要使用KeyListener而不是使用Key Bindings

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0), "doSomething1");
getActionMap().put("doSomething1", new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
         left = !left;
         if (left == true) {
             xv = -2;
         }
    }
});

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0), "doSomething2");
getActionMap().put("doSomething2", new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
           right = !right;
            if (right == true) {
                xv = 2;
            }
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM