Java Keylistener не работает после экспорта - PullRequest
1 голос
/ 26 апреля 2011

У меня есть JFrame, в котором размещен мой апплет.В апплете есть KeyListener для обработки клавиш со стрелками и клавиши ввода / выхода.

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

Однако, когда я экспортирую свой проект в исполняемый файл Jar ... клавиши со стрелками все еще работают, а клавиши ввода и выхода - нет.Как я могу решить эту проблему?

Код в основном классе:

public static void main(String[] args) throws Exception {
    new SnakeApp().snake();
}

public void snake() throws Exception {
    // Set windows look
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

    // Create window
    JFrame window = new JFrame("FinalSnake");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Add FinalSnake applet
    FinalSnake finalSnake = new FinalSnake();
    finalSnake.init();
    finalSnake.start();
    window.add(finalSnake);

    // Set size
    window.setResizable(false);
    window.getContentPane().setPreferredSize(new Dimension(FinalSnake.GRIDSIZE * FinalSnake.GRIDX, FinalSnake.GRIDSIZE * FinalSnake.GRIDY));
    window.pack();

    // Set Icon
    window.setIconImage(new ImageIcon(this.getClass().getResource("gfx/icon.png")).getImage());

    // Center the frame
    Dimension frameSize = Toolkit.getDefaultToolkit().getScreenSize();
    window.setLocation((frameSize.width - window.getSize().width) / 2, (frameSize.height - window.getSize().height) / 2);

    // Show the window
    window.setVisible(true);

    // And focus the FinalSnake applet
    finalSnake.requestFocusInWindow();
}

Код из апплета FinalSnake:

@Override
public void keyPressed(KeyEvent e) {
    if (this.world == null) {
        if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_LEFT) {
            this.gameType--;

            if (this.gameType == 0) {
                this.gameType = 2;
            }
        }

        if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_RIGHT) {
            this.gameType++;

            if (this.gameType == 3) {
                this.gameType = 1;
            }
        }

        if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE) {
            this.world = new World(this.gameType);
        }
    } else {
        if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
            this.world = null;
        }
    }
}

Надеюсь, кто-нибудь сможет это исправитьдля меня ... Thnx

1 Ответ

0 голосов
/ 26 апреля 2011

Вы можете попробовать использовать метод consume() для вашей переменной KeyEvent.Он говорит:

Потребляет это событие, чтобы оно не было обработано способом по умолчанию источником, который его создал.

Это будет переопределять способ по умолчанию, я полагаю.

public void keyPressed(KeyEvent e) {
//Do your actions
e.consume();
}
...