2016-06-07 4 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():

Возвращает целое число KEYCODE, связанный с ключом в этом случае. Возвращает: целочисленный код для фактического ключа на клавиатуре. (Для KEY_TYPED событий, KEYCODE является VK_UNDEFINED.)

Поместите свой код в keyPressed или keyReleased методов, и вы будете хорошо идти с кодом, как есть.

Стоит отметить, что было сказано в этом ответе: https://stackoverflow.com/a/7071810/2581593 KeyTyped события распознавать только печатные символы клавиш, так что он не будет работать с VK_LEFT в любом случае.

Что касается движущейся метки вокруг.

setBounds() имеет смысл только в том случае, если компоновка компонента, который вы хотите поместить компонентом с границами, равна null.

Цитирование документация Java еще раз:

Каждый объект JPanel инициализирован использовать FlowLayout, если вы не указать иначе при создании JPanel.

В вашем случае, чтобы быть в состоянии нарисовать этикетку img как данность координаты вам нужно добавить: pan.setLayout(null);

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