2014-04-16 98 views
1

對於作業分配,我需要創建一個基本顯示球的程序,用戶應該可以使用左右鍵移動它。但是,該程序不響應密鑰。我不知道錯誤在哪裏,如果有人能幫忙,我會非常感激!這是代碼:在Java中使用KeyListener

public class GraphicsComponent extends JComponent 
{ 
Ellipse2D.Double ball = new Ellipse2D.Double(200, 400, 80, 80); 

    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setColor(Color.RED); 
     g2.fill(ball); 
     g2.draw(ball); 
    } 

} 


public class BallViewer 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); //creates a new JFrame called frame 

     frame.setSize(600,600); //invokes the method setSize on the implicit parameter frame 
     frame.setTitle("Move this Ball"); //sets the title of the fram 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final GraphicsComponent g = new GraphicsComponent(); //creates a new GraphicsComponent called g, is final so that the inner class can access it 
     frame.add(g);//adds component g to the frame 

     frame.setVisible(true); //sets the visibility of the frame 

     class PressListener implements KeyListener //creates an inner class that implements MouseListener interface 
     { 
      public void keyPressed(KeyEvent e) 
      { 

       if (e.getKeyCode() == KeyEvent.VK_LEFT) 
       { 
        System.out.println("Left key pressed"); 
       } 

       if (e.getKeyCode() == KeyEvent.VK_RIGHT) 
       { 
        System.out.println("Right key pressed"); 
       } 
      } 

      public void keyReleased(KeyEvent e) 
      { 
      } 

      public void keyTyped(KeyEvent e) 
      { 
      } 
     } 

     PressListener listener = new PressListener(); 
     g.addKeyListener(listener); 
    } 
} 

回答

2

KeyListener時,它註冊的組件是可聚焦和具有可獲得焦點將只響應,JComponent是不是默認可聚焦。

相反,使用key bindings,他們節省您解決有關KeyListener

焦點問題,你也將有一個與製作Ellipse2D移動的問題,通過將其設定開始搞亂的所有無驅是爲0x0和平移位置在Graphics上下文要繪製球

舉個例子位置...

InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
ActionMap am = getActionMap(); 

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up"); 
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down"); 
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "left"); 
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "right"); 

am.put("up", new DeltaAction(0, -10)); 
am.put("down", new DeltaAction(0, 10)); 
am.put("left", new DeltaAction(-10, 0)); 
am.put("right", new DeltaAction(10, 0)); 

而且DeltaAction ... pointEllipse被繪製的位置...

public class DeltaAction extends AbstractAction { 

    private int deltaX; 
    private int deltaY; 

    public DeltaAction(int deltaX, int deltaY) { 
     this.deltaX = deltaX; 
     this.deltaY = deltaY; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     point.x += deltaX; 
     point.y += deltaY; 

     if (point.x < 0) { 
      point.x = 0; 
     } else if (point.x + DIAMETER >= getWidth()) { 
      point.x = getWidth() - DIAMETER; 
     } 
     if (point.y < 0) { 
      point.y = 0; 
     } else if (point.y + DIAMETER >= getHeight()) { 
      point.y = getHeight() - DIAMETER; 
     } 
     repaint(); 
    } 

}