2013-10-03 40 views
0

我無法讓按鍵事件工作,它不能識別按鍵輸入,有人可以幫忙嗎?鍵按不會工作

我有三個類的球員,EXE和董事會

這裏是板類

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyListener; 
import java.awt.event.KeyEvent; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Board extends JPanel implements ActionListener{ 
private Timer timer; 
private Player player; 

//private Floor 

public Board() { 

    addKeyListener(new TAdapter()); 
    setFocusable(true); 
    setBackground(Color.WHITE); 
    setDoubleBuffered(true); 

    player = new Player(); 
    //floor = new Floor(); 

    timer = new Timer(5, this); 
    timer.start(); 
} 

public void paint(Graphics g) { 

    super.paint(g); 

    Graphics2D g2d = (Graphics2D)g; 
    g2d.drawImage(player.getImage(), player.getX(), player.getY(), this); 
    // g2d.drawImage(floor.getImage(), floor.getX(), floor.getY(), this); 
    //System.out.println(player.getX() + ", " + player.getY()); 
    Toolkit.getDefaultToolkit().sync(); 
    g.dispose(); 
} 

public void actionPerformed(ActionEvent e) { 
    // checkPlayerOnGround(); 
    player.move(); 
    repaint(); 
} 

private class TAdapter extends KeyAdapter implements KeyListener{ 

    public void keyTyped(KeyEvent e) { 
     player.keyReleased(e); 
     System.out.println("Released"); 
    } 

    public void keyPressed(KeyEvent e) { 
     player.keyPressed(e); 
     System.out.println("Pressed"); 

    } 
} 

}

這裏是球員類

import java.awt.Image; 
import java.awt.event.KeyEvent; 
import javax.swing.ImageIcon; 
import javax.swing.Timer; 
import java.util.TimerTask; 
public class Player{ 

private String player = "player.jpg"; 
private int moveX; 
private int moveY; 
private int x; 
private int y; 
private Image image; 
private boolean canFall = false; 

//private Timer jumpTimer = new Timer(); 
boolean canJump = true; 

public Player() { 
    ImageIcon playeriImage = new ImageIcon(this.getClass().getResource(player)); 
    image = playeriImage.getImage(); 
    x = 40; 
    y = 60; 
} 

public void checkFall() { 
    if(canFall) { 
     moveY = -4; 
    } 
} 

public void move() { 
    //checkFall(); 
    x = moveX + x; 
    y = moveY + y; 

} 

public int getX() { 
    return x; 
} 

public int getY() { 
    return y; 
} 

public Image getImage() { 
    return image; 
} 

public void keyPressed(KeyEvent e) { 

    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_A) { 
     moveX = -4; 

    } 

    if (key == KeyEvent.VK_D) { 
     moveX = 4; 
    } 

    if (key == KeyEvent.VK_W) { 
     if(canJump) 
      this.jump(); 

    } 

} 

public void keyReleased(KeyEvent e) { 
    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_A) { 
     moveX = 0; 

    } 

    if (key == KeyEvent.VK_D) { 
     moveX = 0; 

    } 

} 

這裏是exe類

import javax.swing.JFrame; 

public class Exe extends JFrame { 

public Exe() { 

    add(new Board()); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(500, 500); 
    setLocationRelativeTo(null); 
    setTitle("TSA Video Game"); 
    setResizable(false); 
    setVisible(true); 
} 

public static void main(String[] args) { 
    new Exe(); 

} 

}

在此先感謝

+0

見[運動使用鍵盤](HTTP://tips4java.wordpress。 COM/2013/06/09 /運動使用最鍵盤/)。 – camickr

回答

2

KeyListener如果組件是可聚焦且有焦點將只對關鍵事件作出迴應。

這將是更好的使用Key Bindings API這將使你克服這種限制(如果你想)

我也建議你重寫paintComponent而不是paint。你也應該不會被調用Graphics#dispose,因爲你沒有創建Graphics背景下,這樣做可能會阻止任何被畫上一些系統

我還要表明,5毫秒的延遲(你的定時器)可能是一個有點過度(5毫秒= 200fps!)。

的16(60fps的)或40(25幀)的值可能更適合,降低了系統的開銷... IMHO

+0

是的,但他有'setFocusable(true);' –

+0

@MaximShoustin但他們沒有要求重點,所以面板沒有焦點。另外,該面板沒有實際獲得焦點的手段(僅僅因爲用戶點擊它,不會使其自身焦點) – MadProgrammer