Java:向JFrame添加密钥侦听器
我正在尝试用Java进行图形编程,并且正在尝试一个小练习,在这个练习中我想让一辆汽车在一个框架中来回移动。然后,如果我按下向上或向下箭头键,我想让它运行得更快或更慢。但是,我似乎无法正确添加密钥侦听器。为了测试我的代码,我只想在命令提示符下打印一条消息。任何帮助都将不胜感激 代码按原样编译和运行。我看到一辆车在车架上来回行驶。唯一不起作用的是键侦听器Java:向JFrame添加密钥侦听器,java,swing,jframe,keylistener,Java,Swing,Jframe,Keylistener,我正在尝试用Java进行图形编程,并且正在尝试一个小练习,在这个练习中我想让一辆汽车在一个框架中来回移动。然后,如果我按下向上或向下箭头键,我想让它运行得更快或更慢。但是,我似乎无法正确添加密钥侦听器。为了测试我的代码,我只想在命令提示符下打印一条消息。任何帮助都将不胜感激 代码按原样编译和运行。我看到一辆车在车架上来回行驶。唯一不起作用的是键侦听器 import java.awt.*; import javax.swing.*; import java.awt.event.*; public
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Racing extends JFrame
{
public static class Car extends JComponent implements ActionListener
{
int x=0;
int y=0;
int delta = 10;
Timer timer;
int z = 300;
public Car()
{
timer = new Timer(20,this);
timer.start();
addKeyListener(new KeyAdapter()
{
@Override
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_UP)
System.out.println("The up key was pressed!");
}
});
}
public void paint(Graphics g)
{
super.paintComponent(g);
y = getHeight();
z = getWidth();
g.setColor(Color.BLUE);
g.fillRect(0, 0, z, y);
Polygon polygon = new Polygon();
polygon.addPoint(x + 10, y - 20);
polygon.addPoint(x + 20, y - 30);
polygon.addPoint(x + 30, y - 30);
polygon.addPoint(x + 40, y - 20);
g.setColor(Color.BLACK);
g.fillOval(x + 10, y - 11, 10, 10);
g.fillOval(x + 30, y - 11, 10, 10);
g.setColor(Color.GREEN);
g.fillRect(x, y - 21, 50, 10);
g.setColor(Color.RED);
g.fillPolygon(polygon);
g.setColor(Color.BLUE);
}
public void actionPerformed(ActionEvent e) {
x += delta;
if (x > z-40) {
delta *= -1;
x = (z-40);
} else if (x < 0) {
delta *= -1;
x = 0;
}
repaint();
}
}
public static void main(String[] args)
{
JFrame frame = new JFrame("Racing");
frame.setPreferredSize(new Dimension(600,300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.add(new Car());
frame.setVisible(true);
frame.setFocusable(true);
}
}
import java.awt.*;
导入javax.swing.*;
导入java.awt.event.*;
公共级赛车扩展JFrame
{
公共静态类Car扩展JComponent实现ActionListener
{
int x=0;
int y=0;
int delta=10;
定时器;
int z=300;
公共汽车
{
定时器=新定时器(20,此);
timer.start();
addKeyListener(新的KeyAdapter()
{
@凌驾
按下公共无效键(按键事件e)
{
如果(例如getKeyCode()==KeyEvent.VK_UP)
System.out.println(“按下了向上键!”);
}
});
}
公共空间涂料(图g)
{
超级组件(g);
y=getHeight();
z=getWidth();
g、 setColor(Color.BLUE);
g、 fillRect(0,0,z,y);
多边形=新多边形();
多边形添加点(x+10,y-20);
多边形添加点(x+20,y-30);
多边形添加点(x+30,y-30);
多边形添加点(x+40,y-20);
g、 设置颜色(颜色为黑色);
g、 椭圆形(x+10,y-11,10,10);
g、 椭圆形(x+30,y-11,10,10);
g、 setColor(Color.GREEN);
g、 fillRect(x,y-21,50,10);
g、 setColor(Color.RED);
g、 填充多边形(多边形);
g、 setColor(Color.BLUE);
}
已执行的公共无效操作(操作事件e){
x+=δ;
如果(x>z-40){
delta*=-1;
x=(z-40);
}else如果(x<0){
delta*=-1;
x=0;
}
重新油漆();
}
}
公共静态void main(字符串[]args)
{
JFrame=新JFrame(“赛车”);
框架。设置首选尺寸(新尺寸(600300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
车架。添加(新车());
frame.setVisible(true);
frame.setFocusable(真);
}
}
简单的回答是,不要这样做,这涉及到太多的问题
相反,请使用密钥绑定API。有关更多详细信息,请参阅
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.KeyStroke;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Racing extends JFrame {
public static class Car extends JComponent implements ActionListener {
int x = 0;
int y = 0;
int delta = 10;
Timer timer;
int z = 300;
public Car() {
timer = new Timer(20, this);
timer.start();
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "goingUp");
ActionMap am = getActionMap();
am.put("goingUp", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("The up key was pressed!");
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
y = getHeight();
z = getWidth();
g.setColor(Color.BLUE);
g.fillRect(0, 0, z, y);
Polygon polygon = new Polygon();
polygon.addPoint(x + 10, y - 20);
polygon.addPoint(x + 20, y - 30);
polygon.addPoint(x + 30, y - 30);
polygon.addPoint(x + 40, y - 20);
g.setColor(Color.BLACK);
g.fillOval(x + 10, y - 11, 10, 10);
g.fillOval(x + 30, y - 11, 10, 10);
g.setColor(Color.GREEN);
g.fillRect(x, y - 21, 50, 10);
g.setColor(Color.RED);
g.fillPolygon(polygon);
g.setColor(Color.BLUE);
}
public void actionPerformed(ActionEvent e) {
x += delta;
if (x > z - 40) {
delta *= -1;
x = (z - 40);
} else if (x < 0) {
delta *= -1;
x = 0;
}
repaint();
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Racing");
frame.setPreferredSize(new Dimension(600, 300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.add(new Car());
frame.setVisible(true);
frame.setFocusable(true);
}
});
}
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Polygon;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入javax.swing.AbstractAction;
导入javax.swing.ActionMap;
导入javax.swing.InputMap;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.KeyStroke;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共级赛车扩展JFrame{
公共静态类Car扩展JComponent实现ActionListener{
int x=0;
int y=0;
int delta=10;
定时器;
int z=300;
公共汽车{
定时器=新定时器(20,此);
timer.start();
InputMap im=getInputMap(在聚焦窗口中时);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,0),“goingUp”);
ActionMap am=getActionMap();
am.put(“goingUp”,新抽象动作(){
@凌驾
已执行的公共无效操作(操作事件e){
System.out.println(“按下了向上键!”);
}
});
}
@凌驾
受保护组件(图形g){
超级组件(g);
y=getHeight();
z=getWidth();
g、 setColor(Color.BLUE);
g、 fillRect(0,0,z,y);
多边形=新多边形();
多边形添加点(x+10,y-20);
多边形添加点(x+20,y-30);
多边形添加点(x+30,y-30);
多边形添加点(x+40,y-20);
g、 设置颜色(颜色为黑色);
g、 椭圆形(x+10,y-11,10,10);
g、 椭圆形(x+30,y-11,10,10);
g、 setColor(Color.GREEN);
g、 fillRect(x,y-21,50,10);
g、 setColor(Color.RED);
g、 填充多边形(多边形);
g、 setColor(Color.BLUE);
}
已执行的公共无效操作(操作事件e){
x+=δ;
如果(x>z-40){
delta*=-1;
x=(z-40);
}else如果(x<0){
delta*=-1;
x=0;
}
重新油漆();
}
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“赛车”);
frame.setPreferredSize(新尺寸(600300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
车架。添加(新车());
frame.setVisible(true);
frame.setFocusable(真);
}
});