【问题标题】:Java: Moving second rectangle using different keys with KeyListenerJava:使用带有 KeyListener 的不同键移动第二个矩形
【发布时间】:2016-11-20 06:45:46
【问题描述】:

我正在制作一个小程序,其中两个矩形围绕赛车轨道行驶。当我运行程序时,一切都按计划进行,我可以使用箭头键在轨道周围移动黑色矩形。如果我想用 W,A,S,D 移动红色矩形,我应该怎么做?

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

public class first extends JLabel implements ActionListener, KeyListener {

Timer t = new Timer(5, this);
double x = 0, y = 25, velx = 0, vely = 0;


public first() {
    t.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
}

public static void main(String[] args) {
    JLabel jl = new JLabel();
    JPanel jp = new JPanel();
    JFrame f = new JFrame();
    first m = new first();

    f.add(m);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(1650,1080);
    f.setExtendedState(JFrame.MAXIMIZED_BOTH);

    //The image below is a race car track I drew in Microsoft Paint
    jl.setIcon(new ImageIcon("C:\\Users\\Jack\\Pictures\\JavaImages\\racetrack2.png"));

    f.add(jp);
    jp.add(jl);

    f.validate();
}

public void paintComponent (Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;     
    g2.setColor(Color.RED);
    g2.fill(new Rectangle2D.Double(0, 80, 90, 50));

    g2.setColor(Color.BLACK);
    g2.fill(new Rectangle2D.Double(x, y, 90, 50));
}


public void actionPerformed(ActionEvent e) {
    repaint();
    x += velx;
    y += vely;
}

public void up() {
    vely = -3.5;
    velx = 0;
}

public void down() {
    vely = 3.5;
    velx = 0;
}

public void left() {
    velx = -4.5;
    vely = 0;
}

public void right() {
    velx = 4.5;
    vely = 0;
}

/*public void upStopped() {
    velx = 0;
    vely = 0;
}

public void downStopped() {
    velx = 0;
    vely = 0;
}

public void leftStopped() {
    velx = 0;
    vely = 0;
}

public void rightStopped() {
    velx = 0;
    vely = 0;
}*/

public void keyPressed(KeyEvent e) {
    int code = e.getKeyCode();
    if(code == KeyEvent.VK_UP) {
        up();
    }
    if(code == KeyEvent.VK_DOWN) {
        down();
    }
    if(code == KeyEvent.VK_LEFT) {
        left();
    }
    if(code == KeyEvent.VK_RIGHT) {
        right();
    }

    if(code == KeyEvent.VK_W) {

    }
    if(code == KeyEvent.VK_S) {

    }
    if(code == KeyEvent.VK_A) {

    }
    if(code == KeyEvent.VK_D) {

    } 
}

public void keyReleased(KeyEvent e) {
    /*int code2 = e.getKeyCode();
    if(code2 == KeyEvent.VK_UP) {
        upStopped();
    }

    if(code2 == KeyEvent.VK_DOWN) {
        downStopped();
    }

    if(code2 == KeyEvent.VK_LEFT) {
        leftStopped();
    }

    if(code2 == KeyEvent.VK_RIGHT) {
        rightStopped();
    }*/
}

public void keyTyped(KeyEvent e) {}

}

【问题讨论】:

  • 首先取消对 W/S/A/D 代码的注释。
  • 在此处搜索 Java & Swing & KeyBingings & paintComponent,JLabel 不可用于 KeyEvents
  • 如果你有这个固定的 g2.fill(new Rectangle2D.Double(0, 80, 90, 50));

标签: java swing jlabel paint keylistener


【解决方案1】:

我可以使用箭头键在轨道周围移动黑色矩形。如果我想用 W,A,S,D 移动红色矩形,我应该怎么做?

  1. 使用 Key Bindings 而不是 KeyListener。
  2. 您还需要使用 Timer 在按下某个键时启动动画,并在释放某个键时停止动画,因为一次只能为一个键生成事件。

查看Motion Using The Keyboard 了解有关上述概念的更多信息。 keyboardAnimation 代码是实现这两个概念的完整工作示例。

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 2013-06-19
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多