저는 키보드에서 사용자 입력을받는 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) {
}
}
당신은 모든 당신이 그것을 작동하도록 JFrame의에 사용되는 구성 요소뿐만 아니라
setFocusable(true);
에 KeyListener
를 추가 할 필요가
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();
}
}
나에게는 JPanels에서만 작동한다. 'JFrame'은'JPanel'의 컨테이너/래퍼입니다. 나는 JPanel에'setFocusable'이 작동한다는 것을 알고있다. –
모르겠다. 대답을 게시하고, 병을 뺀다. –
권자, 확인, 병으로 내 대답을 바꾼다. –