2015-01-07 2 views
1

я создал JFrame и некоторые прямоугольников в нем с помощью g.fillRect, например:Добавить KeyEvent для ключей NumLock клавиатуры в JFrame

Rectangle rec1 = new Rectangle(0, 10, 50, 50); 
    g.fillRect((int) rec1.getX(), (int) rec1.getY(), (int) rec1.getWidth(), 
      (int) rec1.getHeight()); 

Теперь я хочу знать, когда кто-то нажимает часть NumLock ключи, я попытался использовать этот код:

public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     y = y - 50; 
    } 

этот код не работает, я не знаю, почему, мне нужно KeyListener для каждого numlock ключ от 1-9 .. Как это сделать? Thx

Полный код:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.event.KeyEvent; 
import java.util.Timer; 
import java.util.TimerTask; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 

public class Game extends JComponent { 
    private static int y = 0; 

    public static void main(String args[]) { 
     JFrame mainFrame = new JFrame("BlueTAP Game"); 
     mainFrame.getContentPane().add(new Game()); 
     mainFrame.setSize(205, 225); 
     mainFrame.setVisible(true); 
     mainFrame.setFocusable(true); 
     final JFrame parent = new JFrame(); 
     JOptionPane 
       .showMessageDialog(
         parent, 
         "Shown only one time! - In this game, the buttons are arranged as the keyboard numpad buttons. you are supposed to click on the right keyboard button place by the grey button place.", 
         "Game Instructions", JOptionPane.PLAIN_MESSAGE); 
     final Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 
       System.out.println("H" + y); 
      } 
     }, 0, 1000); 
    } 

    public void paint(Graphics g) { 

     Rectangle rec1 = new Rectangle(10, 10, 50, 50); 
     g.fillRect((int) rec1.getX(), (int) rec1.getY(), (int) rec1.getWidth(), 
       (int) rec1.getHeight()); 
     Rectangle rec2 = new Rectangle(70, 10, 50, 50); 
     g.fillRect((int) rec2.getX(), (int) rec2.getY(), (int) rec2.getWidth(), 
       (int) rec2.getHeight()); 
     Rectangle rec3 = new Rectangle(130, 10, 50, 50); 
     g.fillRect((int) rec3.getX(), (int) rec3.getY(), (int) rec3.getWidth(), 
       (int) rec3.getHeight()); 
     Rectangle rec4 = new Rectangle(10, 70, 50, 50); 
     g.fillRect((int) rec4.getX(), (int) rec4.getY(), (int) rec4.getWidth(), 
       (int) rec4.getHeight()); 
     Rectangle rec5 = new Rectangle(70, 70, 50, 50); 
     g.fillRect((int) rec5.getX(), (int) rec5.getY(), (int) rec5.getWidth(), 
       (int) rec5.getHeight()); 
     Rectangle rec6 = new Rectangle(130, 70, 50, 50); 
     g.fillRect((int) rec6.getX(), (int) rec6.getY(), (int) rec6.getWidth(), 
       (int) rec6.getHeight()); 
     Rectangle rec7 = new Rectangle(10, 130, 50, 50); 
     g.fillRect((int) rec7.getX(), (int) rec7.getY(), (int) rec7.getWidth(), 
       (int) rec7.getHeight()); 
     Rectangle rec8 = new Rectangle(70, 130, 50, 50); 
     g.fillRect((int) rec8.getX(), (int) rec8.getY(), (int) rec8.getWidth(), 
       (int) rec8.getHeight()); 
     g.setColor(Color.LIGHT_GRAY); 
     Rectangle rec9 = new Rectangle(130, 130, 50, 50); 
     g.fillRect((int) rec9.getX(), (int) rec9.getY(), (int) rec9.getWidth(), 
       (int) rec9.getHeight()); 
    } 

    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_NUMPAD0) { 
      y = y - 50; 
     } 
    } 
} 
+0

Там нет 'KeyListener' в вашем коде. Вы просто добавили метод, который не переопределяет и не реализует что-либо. Нет причин, по которым AWT/Swing должен вызывать этот метод. См. [«Как написать прослушиватель ключей»] (http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html) – Holger

+0

@Holger Привет, я попытался использовать KeyListener, но я не могу этого сделать потому что я использую эту строку: \t \t mainFrame.addKeyListener (this); но вы не можете использовать это в статическом контексте (в публичном статическом void main ...). – user3731180

+0

@Holger Thx, я получил его :) – user3731180

ответ

2

Вы должны использовать значение ключевого Numpad:

VK_NUMPAD0 
VK_NUMPAD1 
VK_NUMPAD2 

...

VK_NUMPAD9 
+0

Все еще не работает :(thx в любом случае, загрузил полный код .. – user3731180

+1

@ user3731180 Вам нужно добавить KeyListener для каждого отдельного компонента. Вот почему я рекомендую вам использовать другой способ: см. [этот учебник] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) для одного альтернативного метода. –

+0

@newbiedoodle Но что вы подразумеваете под этим я должен добавить keylistener для каждого компонента? Я просто хочу, чтобы компьютер заметил, когда я нажимаю клавишу, поэтому мне нужно просто добавить его в JFrame? – user3731180

Смежные вопросы