ボールをペイントし、矢印キーを押すと、押した方向にボールが画面上を移動するプログラムを作成しようと思いました。最初に、「上」矢印キーの動きだけを行うプログラムを作成することから始めました。
解決策を探しましたが、このコードの何が問題なのかわかりません。入力マップとアクション マップの問題 (つまり、キーの押下を認識するプログラムの問題) なのか、Swing での 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();
}
}
}