簡體   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