2016-06-07 27 views
0
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class Game implements KeyListener { 

    static int imgx = 20; 
    static int imgy = 20; 
    JFrame fen = new JFrame(); 
    JPanel pan = new JPanel(); 

    public void display() { 

     fen.add(pan); 
     fen.addKeyListener(this); 
     JLabel img = new JLabel(); 
     img.setText("zzz"); 
     img.setBounds(imgx, imgy, 20, 20); 
     pan.add(img); 
     fen.setVisible(true); 
     fen.setSize(480, 272); 
    } 

    public static void main(String[] args) { 
     Game disp = new Game(); 
     disp.display(); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     if(e.getKeyCode() == KeyEvent.VK_LEFT) { 
      System.out.println("test"); 
      imgx -= 10; 
      fen.revalidate(); 
     } 
    } 


} 

爲什麼當我輸入左鍵時,標籤不會自動移動?請幫助我... 我有一個JFrame的關鍵偵聽器,當我在鍵盤上鍵入左鍵時,爲什麼它不會進入我的keyTyped事件?爲什麼它不動?

回答

3

關於keyListener。

e.getkeyCode()幫助:

返回與此事件中的鍵關聯的整數密鑰號碼。 返回:鍵盤上實際鍵的整數代碼。 (對於 KEY_TYPED事件,鍵代碼是VK_UNDEFINED。)

代碼放在keyPressedkeyReleased方法,你會好去的代碼是。

值得一提的是什麼這個答案指出: https://stackoverflow.com/a/7071810/2581593 事件的keyTyped只認可打印字符鍵,這樣就不會與VK_LEFT反正工作。

關於移動標籤。

setBounds()只有在要將組件放置到邊界的組件的佈局爲null時纔有意義。

引用Java文檔一次:

每個JPanel的對象初始化使用的FlowLayout,除非你 創建JPanel時指定不同。

你的情況是能畫標籤img給出的座標,您需要添加: pan.setLayout(null);