2017-05-17 57 views
0

在我的簡單程序中,球的起點是x=0, y=0。計時器也設置在每個Timer動作上,x增加a,y增加b。 a和b的初始值都是1.並且這是有效的:當運行程序Moving1.java時,球從框架的上方和左方向右和向下。在Java中添加KeyListener?

但是,我試圖添加KeyEvents,以便我可以在KeyEvents中更改a和b的值,但它們不起作用。出於某種原因,程序似乎不會去任何KeyEvent。如何修復?主KeyEvent是keyPressed,但我已經爲每個KeyEvent寫了b = 0,它應該對球的方向生效。

如果有人可以幫助我這個問題,我想我可以正確的軟件件添加到keyPressed Event像:

public void keyPressed (KeyEvent e) { 
    int KeyCode = e.getKeyCode(); 
    if (KeyCode == KeyEvent.VK_LEFT) { 
     a = -1; 
     b = 0; 
    } 
} 

等。

但這裏是我的代碼:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Moving1 extends JPanel implements KeyListener { 
    int x, y; 
    int a = 1, b = 1; 
    Timer timer; 


    public Moving1() { 
     x = 0; 
     y = 0; 
     timer = new Timer(30, new TimerListener()); 
    } 

    private class TimerListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      x += a; // add horizontal 
      y += b; // add vertical 
      repaint(); 
     } 
    } 

    public void keyPressed(KeyEvent e) { 
     b = 0; 
    } 

    public void keyReleased(KeyEvent e) { 
     b = 0; 
    } 

    public void keyTyped(KeyEvent e) { 
     b = 0; 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.fillOval(x, y, 10, 10); 
    } 

    public static void main(String[] args) { 
     JFrame f = new JFrame("Moving1"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Moving1 m = new Moving1(); 
     f.add(m); 
     f.setSize(500, 500); 
     f.setVisible(true); 
     m.timer.start(); 
    } 
} 
+0

您是否在某處添加了「addKeyListener」? – khelwood

+0

文檔:http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html – Gimby

+0

您的''Moving1''現在是''KeyListener''的一個實例,但是您沒有告訴任何組件它應該使用KeyListener ... – f1sh

回答

1

你不添加KeyListener到任何東西,所以它不能處理任何事件。把下面這行放在你的main中,這應該讓事件來臨。

f.addKeyListener(m);