0

JFrameユーザーがキーボードから入力するウィンドウを持つプログラムを実行しようとしています。したがって、ユーザーが単語を入力すると、ステートメント クラスはその単語がそこにあるかどうかを確認し、出力します。

今のところ、ステートメントクラスをキーボードクラスで動作させることはできません。私は本当にこの方法を使用してキーボード入力を取得したくないので、皆さんはもっと良い方法を知っています。

問題: ステートメント クラスがキーボード入力を取得するように修正します。

これはステートメントクラスです:

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();
}

}
4

1 に答える 1

1

KeyListenerJFrame で使用したすべてのコンポーネントに追加して、それを機能させる必要があります。

setFocusable(true);同じように。

ただし、 に追加KeyListenerする場合は、次のようにJFrameカスタムKeyEventDispatcher を作成して に登録しますKeyboardFocusManager

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

(すべてのコンポーネントを使用して、代わりに にJPanel追加します)JPanelJFrame

于 2013-09-29T14:47:55.630 に答える