如何在 JAVA 中使用键盘输入将动画设置为 运行?
How can I get Animation to run with KeyBoard input in JAVA?
今天困扰我的问题是,我正在尝试绘制一个红色矩形,只要用户按下 space,它就会移动。问题是每当我按下 space 时,矩形就不会移动。知道为什么以及如何解决这个问题吗?
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class Animation extends JPanel implements ActionListener, KeyListener{
int x = 0, y = 0, velx=0;
public Animation(){
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
public static void main(String args[]){
JFrame frame = new JFrame("Animation Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(500, 500);
Animation a = new Animation();
frame.add(a);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, 500, 500);
g.setColor(Color.RED);
g.fillRect(x, 50, 30, 20);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
x = x + velx;
repaint();
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode();
if(keyCode == e.VK_SPACE){
velx = 2;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
对您的代码进行了以下更改。按回 space 现在应该移动矩形。
- 将 KeyListener 添加到 JFrame。
- 更改键盘事件侦听器方法。
代码:
public class Animation extends JPanel implements ActionListener, KeyListener{
int x = 0, y = 0, velx=0;
public Animation(){
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
public static void main(String args[]){
JFrame frame = new JFrame("Animation Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(500, 500);
Animation a = new Animation();
frame.add(a);
frame.repaint();
frame.addKeyListener(a);
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, 500, 500);
g.setColor(Color.RED);
g.fillRect(x, 50, 30, 20);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
x = x + velx;
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode();
if(keyCode == e.VK_SPACE){
velx = 2;
x = x + velx;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
问题是 KeyListener
只是...代码中的一个难题。
它只会在注册到的组件可聚焦且具有键盘焦点时响应按键事件。问题是,焦点改变了,管理和控制起来很痛苦。
相反,您应该使用旨在帮助解决此问题的Key Bindings API
SO 上有很多键绑定示例,也许像 这样的东西可能会有所帮助
今天困扰我的问题是,我正在尝试绘制一个红色矩形,只要用户按下 space,它就会移动。问题是每当我按下 space 时,矩形就不会移动。知道为什么以及如何解决这个问题吗?
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class Animation extends JPanel implements ActionListener, KeyListener{
int x = 0, y = 0, velx=0;
public Animation(){
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
public static void main(String args[]){
JFrame frame = new JFrame("Animation Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(500, 500);
Animation a = new Animation();
frame.add(a);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, 500, 500);
g.setColor(Color.RED);
g.fillRect(x, 50, 30, 20);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
x = x + velx;
repaint();
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode();
if(keyCode == e.VK_SPACE){
velx = 2;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
对您的代码进行了以下更改。按回 space 现在应该移动矩形。
- 将 KeyListener 添加到 JFrame。
- 更改键盘事件侦听器方法。
代码:
public class Animation extends JPanel implements ActionListener, KeyListener{
int x = 0, y = 0, velx=0;
public Animation(){
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
public static void main(String args[]){
JFrame frame = new JFrame("Animation Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(500, 500);
Animation a = new Animation();
frame.add(a);
frame.repaint();
frame.addKeyListener(a);
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, 500, 500);
g.setColor(Color.RED);
g.fillRect(x, 50, 30, 20);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
x = x + velx;
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode();
if(keyCode == e.VK_SPACE){
velx = 2;
x = x + velx;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
问题是 KeyListener
只是...代码中的一个难题。
它只会在注册到的组件可聚焦且具有键盘焦点时响应按键事件。问题是,焦点改变了,管理和控制起来很痛苦。
相反,您应该使用旨在帮助解决此问题的Key Bindings API
SO 上有很多键绑定示例,也许像