2013-04-26 37 views
1

我一直在閱讀java文檔,並試圖理解關鍵偵聽器及其用法。我設法做出一個簡單的程序,其中'w'和's'切換背景顏色,但是當我試圖讓他們移動一個綵球時,他們停止了響應。我相當肯定這不是一個繪畫問題,因爲我通讀了JavaDocs常見的繪畫問題。我已經將JFrame設置爲可調整的(或者至少我認爲我有)。如果有人能指出我在正確的方向,將不勝感激。添加到JFrame時KeyListeners沒有響應

這裏是主類

import javax.swing.JFrame; 
import java.awt.EventQueue; 

public class frame { 

    public static void main(String[] args){ 

     EventQueue.invokeLater(new Runnable() 
     {     
      @Override 
      public void run() 
      {  
       showGui();             
      } 
     });   
    } 

    public static void showGui(){ 
     JFrame f = new JFrame("Testing.."); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.setFocusable(true); 
      f.add(new Gui()); 
      f.setSize(300,300); 
      f.setVisible(true);    
    } 
} 

和GUI/KeyListener的類

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.BorderFactory; 
import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class Gui extends JPanel { 

    public Gui(){ 
     HandlerClass handle = new HandlerClass(); 
     setBorder(BorderFactory.createLineBorder(Color.black)); 
     addKeyListener(handle); 
    } 

    int x = 30; 
    int y = 30; 

    public void paintComponent(Graphics g){ 
     super.paintComponents(g); 
     g.setColor(Color.BLUE); 
     g.fillRect(x, y, 20, 20); 


    } 

    private class HandlerClass implements KeyListener{ 

     public void keyTyped(KeyEvent e) { 
      switch (e.getKeyChar()){ 
      case 'w': 
      repaint(x,y+1, 20,20); 
       break; 
      case 's': 
       repaint(x,y-1, 20,20); 
       System.out.println("testing if this fires"); 
      break; 
      }    
     } 

     public void keyPressed(KeyEvent e) { 
      //todo 
     } 
     public void keyReleased(KeyEvent e) { 
      //todo 

     } 

    } 

} 

在正確的方向的任何勾縫將是非常有益的,謝謝。

回答

2

KeyListener將只對關鍵事件作出響應時,它連接到該組件是可聚焦並具有焦點。

JPanel默認情況下不符合這些要求中的任何一個(默認情況下,它不是可調焦的)。

出於這些原因,不建議您使用KeyListener,而是使用Key Bindings,它必須克服這些問題

+0

雙Jinks和1 +重拳! – 2013-04-26 01:49:39

+0

謝謝。這正是我正在尋找的答案。我不確定這是否是我的明顯疏忽,或者是否需要徹底改變我對問題的看法。 – Apcragg 2013-04-26 01:51:23

2

如果你已經搜索過這個網站,你就會知道這個解決方案:不要使用KeyListeners,而要使用Key Bindings。如果你還沒有搜索過這個網站,那麼在提問之前你應該做到這一點。

例如爲:a previous answer of mine with example code

+0

+1 Jinks ...... – MadProgrammer 2013-04-26 01:49:15

+1

所以我咬緊牙關,學會了如何使用它們,我現在纔開始工作。感謝您通過KeyListeners使用它們的見解! – Apcragg 2013-04-26 03:14:14

0
repaint(x,y+1, 20,20); 

要繪製y稍高的能力,但你實際上並沒有改變y。嘗試:

repaint(x,++y, 20,20); 

對於其他聽衆也是如此(在另一個方向上)。

+0

謝謝你指出,這不是我想要解決的問題,但它是一個問題,非常感謝! – Apcragg 2013-04-26 01:53:02