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

В 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 ]

1 голос
/ 11 июня 2010

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

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

РЕГРЕССИЯ: JWindow остается поверх всех остальных окон

1 голос
/ 11 июня 2010

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

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

EDIT: Если немного поискать на форуме 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(), а затем добавить действие для всех нажатий клавиш клавиатуры, которые просто его буферизуют, затем вы можете отправлять их в любое время (например, после клавиши возврата)

0 голосов
/ 13 августа 2010

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

...