2012-11-27 30 views
0

當我啓動我的小程序時,我沒有收到關鍵聽衆的響應。我該如何解決?以下是代碼。小程序 - KeyListener不起作用

import java.applet.Applet; 
import java.awt.Graphics; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.util.Timer; 
import java.util.TimerTask; 

public class Main extends Applet { 
private static final long serialVersionUID = 1L; 
public String mode = ""; 
public Graphic gr; 

public void init() { 
    this.setSize(400, 400); 
    gr = new Graphic(); 
    this.add(gr); 
    gr.addKeyListener(new MyKeyListener()); 
    TimerTask timerTask = new TimerTask() { 

     @Override 
     public void run() { 
        gr.requestFocus(); 
      gr.repaint(); 
     } 

    }; 
    new Timer().scheduleAtFixedRate(timerTask, 0, 1000/5); 

} 

public void paint(Graphics g) { 

} 

private class MyKeyListener extends KeyAdapter { 
    public MyKeyListener(){ 
     System.out.println("HELLO"); 
    } 
    public void keyPressed(KeyEvent e) { 

     switch (e.getKeyCode()) { 
     case KeyEvent.VK_UP: 
      gr.direction = Graphic.Direction.up; 
      gr.move(); 

      break; 
     case KeyEvent.VK_DOWN: 
      gr.direction = Graphic.Direction.down; 
      gr.move(); 
      break; 
     case KeyEvent.VK_LEFT: 
      gr.direction = Graphic.Direction.left; 
      gr.move(); 
      break; 
     case KeyEvent.VK_RIGHT: 
      gr.direction = Graphic.Direction.right; 
      gr.move(); 
      break; 
     } 
    } 

    public void keyReleased(KeyEvent e) { 

    } 
} 
} 
+1

*「我沒有收到關鍵監聽器的響應。」*給定代碼,如'public void paint(Graphics g){0} {0}我很驚訝,你什麼都得到。 1)爲什麼在第3個千年AWT? 2)爲什麼applet而不是框架? 3)爲什麼'KeyListener'而不是鍵綁定? 4)爲什麼不打電話給任何提及'重點'的方法?有關詳細信息,請參閱[focus](http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html)教程。 - 看起來你在嘗試「通過魔法編碼」,而這通常不起作用。 –

+1

'this.setSize(400,400);'不要這樣做。小程序大小由HTML中的屬性設置。 –

+0

試圖抓住焦點使用這樣的計時器是任何時候一個可怕的想法,永遠不要這樣做(我知道「只是一個測試」 - 但聲明站立)。避免使用關鍵偵聽器並支持[鍵綁定](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html),它們不會像KeyListener的 – MadProgrammer

回答

2
import java.applet.Applet; 
import java.awt.Graphics; 
import java.awt.Shape; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class TTest extends Applet{ 
    @Override 
    public void init() { 
     // TODO Auto-generated method stub 
     super.init(); 
     this.setSize(400, 400); 
     addKeyListener(new KeyListener()); 

    } 
    class KeyListener extends KeyAdapter{ 
     public KeyListener(){ 

     } 

     @Override 
     public void keyPressed(KeyEvent e) { 
      // TODO Auto-generated method stub 
      super.keyPressed(e); 
      switch(e.getKeyCode()){ 
      case KeyEvent.VK_UP: 
       System.out.println("Pressed up arrow!"); 
       break; 
      case KeyEvent.VK_DOWN: 
       System.out.println("Pressed down arrow!"); 
       break; 
      default: 
       System.out.println("You pressed: " + e.getKeyCode()); 
      } 
     } 

    } 
} 

您必須添加關鍵事件監聽器本身小程序不圖形對象。然而,我認爲可以將鼠標事件監聽器添加到除小應用程序以外的對象中。

+0

1-我認爲'Graphic'有自己的類。 2-關於完全缺乏上下文,我會避免建議使用'KeyListener',這種事情有更好的API - 恕我直言 – MadProgrammer

+0

我認爲問題是在上面的代碼造成的,因爲當你部署你的程序,程序專注於applet對象而不是圖形對象。所以輸入不能從鍵盤監聽器識別。 – Jason