Добавление KeyListener в JWindow без получения каких-либо ключевых событий

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

public class MyWindow extends JWindow {
    ...
    ...
    private void initComponents() {
        ...
        ...
        addKeyListener(new KeyListener() {
            public void keyPressed(KeyEvent e) {
                System.out.println("KEY PRESSED: " + e.getKeyCode());
            }

            public void keyReleased(KeyEvent e) {
                System.out.println("KEY RELEASED: " + e.getKeyCode());
            }

            public void keyTyped(KeyEvent e) {
                System.out.println("KEY TYPED: " +  e.getKeyCode());
            }

        });
    }
}

Кто-нибудь знает, как я могу решить эту проблему с помощью JWindow?

Обратите внимание, что я использую Linux, поэтому я не уверен, что это как-то связано с платформой.

Спасибо

3 ответа

Похоже, что в Linux JWindow практически не работает.

Обходной путь должен использовать JFrame с setUndecorated(true),

РЕГРЕССИЯ: JWindow остается поверх всех других окон

Вы можете попробовать, добавив Listener на панели содержимого вашего JWindow что вы можете получить от window.getContentPane().addKeyListener(..) чтобы увидеть, работает ли это.

Проблема может быть в том, что если у вас есть что-то сфокусированное внутри JWindow но это не JWindow сами события будут отправляться на внутренне сфокусированный элемент. Вы также можете попробовать, добавив KeyListener к тому, что у вас есть в этом окне..

РЕДАКТИРОВАТЬ: Поиск немного на форуме Sun кажется, что, чтобы заставить акцент на JWindow API вы можете сделать это

JWindow myWindow = ...
myWindow.setFocusableWindowState(true);
myWindow.setFocusable(true);

если это все еще не работает, лучшее решение состоит в том, чтобы использовать JFrame:

public class WindowTest {
  public static void main(String[] args) {
    JFrame frame = new JFrame();
    // remove menu bar and title bar
    frame.setUndecorated(true);
    frame.setVisible(true);
    JWindow window = new JWindow(frame); // this works
    window.setBounds(0, 50, 200, 200);
    window.setVisible(true);
  }
}

EDIT2: комплексное решение может быть, чтобы получить ActionMap с getActionMap() а затем добавьте действие для всех нажатий клавиш клавиатуры, которые просто буферизуют его, затем вы можете отправлять их в любое время (например, после клавиши возврата)

У меня тоже была точно такая же проблема..., мое решение состояло в том, что в одном классе моего пакета я расширил JFrame, на котором ключевой слушатель работает отлично, а в методе рисования я использовал графический экземпляр window{Graphics g=win.getGraphics();}... и я нарисовал все в окне, а не на JFrame... до этого я уже позвонил gd{graphicsdevice}.setFullScreenWindow(win);

Другие вопросы по тегам