私はガンと呼ばれるものを作成するコードを記述しようとしています。これを右または左に移動したいと考えています。私はKeyListener
とActionListener
メソッドを実装しましたが、actionPerformed
は機能しません。しかし、keyPressed
メソッドが動作します。私が逃したアイデアは何ですか?ActionPerformedがカスタムコンポーネントで動作していません
public class Gun extends JPanel implements KeyListener, ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int GUN_WIDTH = 100;
private static final int GUN_HEIGHT = 30;
private static final int GUN_UPPER_HEIGHT = 20;
private static final int GUN_UPPER_WIDTH = GUN_WIDTH/4;
int x, y;
int velX;
public Gun() {
x = 250 - GUN_WIDTH/2;
y = 500 - GUN_HEIGHT;
velX = 0;
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
int upperX = x + GUN_WIDTH/2 - GUN_UPPER_WIDTH/2;
int upperY = y - GUN_UPPER_HEIGHT;
g2d.setColor(Color.BLACK);
g2d.fillRect(x, y, GUN_WIDTH, GUN_HEIGHT);
g2d.fillRect(upperX, upperY, GUN_UPPER_WIDTH, GUN_UPPER_HEIGHT);
}
public void left() {
velX = -1;
}
public void right() {
velX = 1;
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
left();
System.out.println("LEFT");
}
if (key == KeyEvent.VK_RIGHT) {
right();
System.out.println("RIGHT");
}
}
@Override
public void keyReleased(KeyEvent arg0) {
}
@Override
public void keyTyped(KeyEvent arg0) {
}
@Override
public void actionPerformed(ActionEvent e) {
x += velX;
repaint();
}
public static void main(String[] args) {
Gun gun = new Gun();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Game");
frame.setLayout(new FlowLayout());
gun.setPreferredSize(new Dimension(500, 500));
frame.add(gun);
frame.setVisible(true);
frame.pack();
}
}
あなたは 'addKeyListener(this)'を使用していますが、あなたはどこでも 'addActionListener'のために同じことをしましたか? – Zircon
'KeyListener'の代わりに[' Key Bindings'](https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)の使用を検討してください。 –
@ Zircon私はそれが何か間違っていたという考えを持っていました。しかし、もう一つの問題があります。私が 'addActionListener(this)'をコンストラクタに入れようとすると、Eclipseは私にそうすることができないので、できません。このメソッドが存在しないように動作します。なぜどんなアイデア? – Mantas