2013-09-29 3 views
0

Я пытаюсь сделать программу с окном JFrame, которое вводит пользователей с клавиатуры. Поэтому, если пользователь вводит слово, класс оператора должен видеть, есть ли там слово и затем распечатывается.Java KeyListener не работает

Как сейчас, я не могу заставить класс выражения работать с классом клавиатуры. Я действительно не хочу использовать этот способ, чтобы получить ввод с клавиатуры, чтобы вы, люди, знали лучший способ, который был бы решеткой.

Проблема: исправить так, чтобы класс утверждения получил ввод с клавиатуры.

Это класс заявление:

public class Statements { 

Keyboard input; 

public Statements(Keyboard input){ 
    this.input = input; 
} 

public void tick() { 

    if(input.up){ 
     System.out.println("inventory"); 
    } 
} 

Это класс клавиатуры, это плохой способ создания ключа слушателя, если вы хотите использовать все символы на клавиатуре. Но это единственный способ, которым я знаю.

public class Keyboard implements KeyListener { 

private boolean[] keys = new boolean[200]; 
public boolean up, down, left, right, i; 

public void update(){ 
    up = keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W]; 
    down = keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S]; 
    left = keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A]; 
    right = keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D]; 
    //all the char on the keyboard 
    ... 
    ... 
    i = keys[KeyEvent.VK_I]; 
} 

public void keyPressed(KeyEvent e) { 
    keys[e.getKeyCode()] = true; 
} 

public void keyReleased(KeyEvent e) { 
    keys[e.getKeyCode()] = false; 
} 

public void keyTyped(KeyEvent e) { 

} 

} 

Основной класс

private static final long serialVersionUID = 1L; 

public static final int WIDTH = 100; 
public static final int HEIGHT = WIDTH/16 * 9; 
public static final int SCALE = 3; 

private boolean running = false; 

private Thread thread; 
private JFrame frame; 
private Keyboard key; 
private Statments stat; 

public Main() { 
    Dimension size = new Dimension(WIDTH * SCALE, HEIGHT * SCALE); 
    setPreferredSize(size); 

    frame = new JFrame(); 
    key = new Keyboard(); 
    stat = new Statments(key); 

    addKeyListener(key); 


} 

public synchronized void start() { 
    running = true; 
    thread = new Thread(this, "Display"); 
    thread.start(); 
} 

public synchronized void stop() { 
    running = false; 
    try { 
     thread.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

public void run() { 
    while (running) { 
     frame.requestFocus(); 
     tick(); 
    } 
    stop(); 
} 

public void tick(){ 
    key.update(); 
    stat.tick(); 
} 

public static void main(String args[]) { 
    Main main = new Main(); 
    main.frame.setResizable(false); 
    main.frame.setTitle("game"); 
    main.frame.add(main); 
    main.frame.pack(); 
    main.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    main.frame.setLocationRelativeTo(null); 
    main.frame.setVisible(true); 

    main.start(); 
} 

} 

ответ

1

Вам нужно добавить KeyListener к каждому компоненту, который вы использовали в JFrame, чтобы сделать его работу и

setFocusable(true); а.

Однако, если вы хотите добавить KeyListener в JFrame, создавать пользовательские KeyEventDispatcher и зарегистрировать его в KeyboardFocusManager, как:

KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
kfm.addKeyEventDispatcher(new MyKeyEventDispatcher()); 

(я хотел бы использовать JPanel и добавить все компоненты JPanel вместо JFrame)

+0

Для меня я работаю только с JPanels. 'JFrame' только контейнер/оболочка для' JPanel'. Я знаю, что 'setFocusable' работает для' JPanel' –

+0

Не знал, пожалуйста, напишите свой ответ, плохо удалите мой –

+0

lol, ok, плохо меняйте свой ответ своими советами –

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