我想我会尝试编写一个程序来绘制一个球,当按下箭头键时,将在屏幕上沿按下的方向移动球。首先,我开始尝试制作一个只执行“向上”箭头键动作的程序。
我四处寻找解决方案,但无法弄清楚这段代码有什么问题。我不知道这是否是我的输入和动作映射的问题(即程序识别按键的问题),或者是否是 JComponent 和 JFrame 类如何在摇摆中工作的问题。我想也许问题也可能是焦点;我真的不知道如何判断组件何时具有焦点。我认为现在该键已设置为 CNTRL+Y 而不是向上,只是因为在某些时候我认为我的字符串在输入地图制作器中指定向上箭头可能有问题。
在这一点上,我很沮丧,我只是想让这该死的东西做点什么,所以我使用的输入映射超出了必要的数量。
代码如下,它很短,格式很糟糕(对不起):
import java.util.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
class BallMover
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
BallFrame frame = new BallFrame();
}
});
}
}
class BallFrame extends JFrame
{
private static final int DEFAULT_WIDTH = 500;
private static final int DEFAULT_HEIGHT = 500;
private BallComponent comp;
public BallFrame()
{
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setSize(this.DEFAULT_WIDTH, this.DEFAULT_HEIGHT);
super.setResizable(false);
super.add(new BallComponent());
super.setVisible(true);
super.setFocusable(true);
}
}
class BallComponent extends JComponent
{
private Ellipse2D.Double ellipse;
private double x = 225;
private double y = 225;
private ActionPress actionPress;
public BallComponent()
{
super();
super.setFocusable(true);
InputMap imap1 = this.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
imap1.put(KeyStroke.getKeyStroke("ctrl Y"), "keyUp1");
InputMap imap2 = this.getInputMap(JComponent.WHEN_FOCUSED);
imap1.put(KeyStroke.getKeyStroke("ctrl Y"), "keyUp2");
InputMap imap3 = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
imap1.put(KeyStroke.getKeyStroke("ctrl Y"), "keyUp3");
ActionMap amap = this.getActionMap();
amap.put("keyUp1", actionPress);
amap.put("keyUp2", actionPress);
amap.put("keyUp3", actionPress);
}
public void paintComponent(Graphics g)
{
super.repaint(); // clear component //
Graphics2D g2d = (Graphics2D)g;
this.ellipse = new Ellipse2D.Double(x, y, 50, 50);
g2d.fill(this.ellipse);
}
private class ActionPress extends AbstractAction
{
public void actionPerformed(ActionEvent event)
{
y = y + 10;
ellipse = new Ellipse2D.Double(x, y, 50, 50);
repaint();
}
}
}