2014-03-27 33 views
1

林新望來的KeyListener,但最近我做了一個小程序,這將是下面,它使用的KeyListener,使A,W,S,d鍵移動方形。那麼我使用Dropbox來獲得這檯筆記本電腦上的程序,現在它不工作。對我來說這似乎很奇怪,它可以在鍵盤上使用,但不能在筆記本電腦鍵盤上使用。任何想法爲什麼?這裏是代碼,以及一部分:KeyListener的工作,但並不

public class Game extends JApplet implements KeyListener 
{ 
    public boolean isMoving = false; 
    int test = 0; 
    Rect r = new Rect(); 
      public void keyPressed(KeyEvent e){} 
      public void keyReleased(KeyEvent e){} // ignore 
      public void keyTyped(KeyEvent e) 
      { 
       char keyChar = e.getKeyChar(); 
       if (keyChar == KeyEvent.VK_S) 
        { 
         r.yVelocity -= 1; 
        } 
       if (keyChar == KeyEvent.VK_W) 
        { 
         r.yVelocity+=1; 
        } 
       if (keyChar == KeyEvent.VK_A) 
        { 
         r.xVelocity -=1; 
        } 
       if (keyChar == KeyEvent.VK_D) 
        { 
         r.xVelocity +=1; 
        } 
      } 
+0

其他問題非常重要;即使操作系統經常無法區分筆記本電腦和外接鍵盤,而Swing應用程序當然不能。首先打印'keyChar'並查看它的價值。 (此外,它可能會更好地使用'之開關,而不是鏈接的'if's在這裏。) – chrylis

回答

2

KeyListener有焦點問題。也就是說,只有在關注焦點和焦點時纔會對關鍵事件做出響應。

簡單的解決方案是將KeyListener註冊的組件註冊爲可聚焦組件,並使用requestFocusInWindow,但這不會讓組件接收到關鍵板的焦點。

一個更好的解決辦法是使用Key Bindings API,它允許您配置要提出的關鍵事件所需的焦點水平...

一鍵綁定例如更新/測試

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Path2D; 
import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Set; 
import javax.swing.AbstractAction; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestKeyBindings { 

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

    public TestKeyBindings() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new KeyPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class KeyPane extends JPanel { 

     private Triangle up; 
     private Triangle down; 
     private Triangle left; 
     private Triangle right; 

     private Set<String> activeKeys; 

     public KeyPane() { 
      activeKeys = new HashSet<>(4); 

      up = new Triangle(20); 
      down = new Triangle(20); 
      left = new Triangle(20); 
      right = new Triangle(20); 

      AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(-90), 10, 10); 
      left.transform(at); 
      at = AffineTransform.getRotateInstance(Math.toRadians(180), 10, 10); 
      down.transform(at); 
      at = AffineTransform.getRotateInstance(Math.toRadians(-270), 10, 10); 
      right.transform(at); 

      InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "upPressed"); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "downPressed"); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "leftPressed"); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "rightPressed"); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true), "upReleased"); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "downReleased"); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true), "leftReleased"); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "rightReleased"); 

      ActionMap am = getActionMap(); 
      am.put("upPressed", new DirectionAction("up", true)); 
      am.put("downPressed", new DirectionAction("down", true)); 
      am.put("leftPressed", new DirectionAction("left", true)); 
      am.put("rightPressed", new DirectionAction("right", true)); 
      am.put("upReleased", new DirectionAction("up", false)); 
      am.put("downReleased", new DirectionAction("down", false)); 
      am.put("leftReleased", new DirectionAction("left", false)); 
      am.put("rightReleased", new DirectionAction("right", false)); 
     } 

     public void addKey(String name) { 
      activeKeys.add(name); 
      repaint(); 
     } 

     public void removeKey(String name) { 
      activeKeys.remove(name); 
      repaint(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 

      int x = (getWidth() - (up.getBounds().width * 3))/2; 
      int y = (getHeight() - 10)/2; 

      AffineTransform at = AffineTransform.getTranslateInstance(x, y); 
      if (activeKeys.contains("left")) { 
       g2d.fill(left.createTransformedShape(at)); 
      } else { 
       g2d.draw(left.createTransformedShape(at)); 
      } 
      at = AffineTransform.getTranslateInstance(x + 40, y); 
      if (activeKeys.contains("right")) { 
       g2d.fill(right.createTransformedShape(at)); 
      } else { 
       g2d.draw(right.createTransformedShape(at)); 
      } 
      at = AffineTransform.getTranslateInstance(x + 20, y - 20); 
      if (activeKeys.contains("up")) { 
       g2d.fill(up.createTransformedShape(at)); 
      } else { 
       g2d.draw(up.createTransformedShape(at)); 
      } 
      at = AffineTransform.getTranslateInstance(x + 20, y + 20); 
      if (activeKeys.contains("down")) { 
       g2d.fill(down.createTransformedShape(at)); 
      } else { 
       g2d.draw(down.createTransformedShape(at)); 
      } 

      g2d.dispose(); 
     } 

     public class DirectionAction extends AbstractAction { 

      private String name; 
      private boolean pressed; 

      public DirectionAction(String name, boolean pressed) { 
       this.name = name; 
       this.pressed = pressed; 
      } 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (pressed) { 
        addKey(name); 
       } else { 
        removeKey(name); 
       } 
      } 

     } 
    } 

    public class Triangle extends Path2D.Double { 

     public Triangle(int size) { 

      moveTo(size/2, 0); 
      lineTo(size, size); 
      lineTo(0, size); 
      closePath(); 

     } 

    } 

} 
+0

有沒有因爲即時通訊一個很好的教程還挺新的,使用按鍵偵聽器或按鍵綁定笑 –

+0

檢查答案的鏈接[關鍵綁定](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer

+0

是的,我的電腦必須搞砸了,我的鍵盤輸入在普通鍵盤的桌面上工作正常,但是當我切換到這不工作我只是再試一次 –