2013-07-26 63 views
1

我正在使用java嘗試製作基本遊戲,但是在使用KeyAdapter時遇到了一些麻煩。我以前使用過非常相似的格式,並且認爲我理解了它,但是這讓我很難過。Java:使用KeyAdapter的幫助

任何幫助,將不勝感激,這裏是我與

public class Board extends JPanel implements ActionListener{ 

Timer timer; 
Tank tank = new Tank(); 

boolean boardset; 

public Board(){ 
setBackground(Color.BLACK); 

ImageIcon alien1ii = new ImageIcon(this.getClass().getResource("si_Alien1.png")); 
Image alien1 = alien1ii.getImage(); 
ImageIcon alien2ii = new ImageIcon(this.getClass().getResource("si_Alien2.png")); 
Image alien2 = alien2ii.getImage(); 
ImageIcon alien3ii = new ImageIcon(this.getClass().getResource("si_Alien3.png")); 
Image alien3 = alien3ii.getImage(); 

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

addKeyListener(new TAdapter()); 

JButton button = new JButton(new AbstractAction("hello2"){ 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     boardset = false; 
    } 
}); 
this.add(button); 

//actual game 
setFocusable(true); 
setDoubleBuffered(true); 
} 

public void paint(Graphics g){ 
    super.paint(g); 
    g.setColor(Color.WHITE); 

    Graphics2D g2d = (Graphics2D) g; 
    g2d.drawImage(tank.getTank(), tank.getx(), tank.getY(), this); 

    g2d.drawLine(0, (tank.getY()+25), 400, (tank.getY()+25)); 

    Toolkit.getDefaultToolkit().sync();  
    g.dispose(); 
} 

public class TAdapter extends KeyAdapter{ 
    public void keyPressed(KeyEvent e){ 
     tank.keyPressed(e); 
     System.out.println("pressedddddddddddddddddd"); 
    } 
    public void keyReleased(KeyEvent e){ 
     tank.keyReleased(e); 
    } 
} 

public void setBoardset(boolean x){ 
    boardset = x; 
} 

public boolean getBoardset(){ 
    return boardset; 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
     repaint(); 
     tank.move(); 
    } 

} 

工作的主要代碼在我看來,這應該是非常簡單的,現在我用這個print語句,看是否類實際上完全識別關鍵筆畫: public class TAdapter extends KeyAdapter {public void keyPressed(KeyEvent e){ tank.keyPressed(e); System.out.println(「pressedddddddddddddddddd」); }

但是,沒有輸出。所以我懷疑它根本沒有識別任何按鍵。但我不明白爲什麼。如果有人有任何建議,我將不勝感激。顯然我有更多的代碼可以分享,如果有人認爲這將有助於找出這個錯誤。

回答

2

1)使用KeyBindings KeyListener有兩個大問題,首先你聽所有的鍵,然後你必須有焦點和焦點。相反,KeyBinding可以綁定一個密鑰,而且您不必關注。

簡單的例子:

AbstractAction escapeAction = new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     //code here example 
     ((JComponent)e.getSource()).setVisible(Boolean.FALSE); 
    }}; 
String key = "ESCAPE"; 
KeyStroke keyStroke = KeyStroke.getKeyStroke(key); 
component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, key); 
component.getActionMap().put(key, escapeAction); 

您可以使用這些常數的JComponent

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 
WHEN_FOCUSED 
WHEN_IN_FOCUSED_WINDOW 

2)不要用具體的繼承,如果它是沒有必要的。

3)不要在頂部類實現ActionListener,看到Single Responsability Principle 例 更改此:

public class Board extends JPanel implements ActionListener{ 

到:

public class Board{ 
    private JPanel panel; 

    private class MyActionListener implements ActionListener{ 
     //code here 
    } 
    } 

4)不要使用繼承,如果它只是相同的例如在你的KeyAdapter,你不會添加任何東西,只需使用KeyAdapter(現在你要使用鍵綁定,所以這是沒用的,但知道:))。

5)當你重寫時添加@Override註釋,你也應該覆蓋paintComponent(..)而不是paint(..)

1

KeyListener患有焦點問題。組件需要既可以集中又可以關注,以便讓聽衆獲知關鍵事件。

更好的解決方案是使用不受這些限制的Key Bindings

+0

謝謝,我會檢查一下。我也忘了提及這是一個在CardHolder中使用的JPanel,我猜這可能會影響我的代碼的重點。 –

+0

我注意到你已經讓它變得可以聚焦,但是那裏沒有什麼需要關注。 – MadProgrammer