1

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を使用しているため、プラットフォームに関係があるかどうかはわかりません.

ありがとう

4

3 に答える 3

1

Listenerコンテンツ ペインにを追加して、動作するかどうかを確認JWindowwindow.getContentPane().addKeyListener(..)てみてください。

問題は、何かがフォーカスされているJWindowがそれ自体ではない場合、JWindowイベントが内側のフォーカスされたアイテムにディスパッチされることです。そのウィンドウ内にあるものに を追加して試すこともできKeyListenerます..

編集: Sunのフォーラムで少し検索すると、 JWindowAPIにフォーカスを強制的に受け入れるには、

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: 複雑な解決策は、 with を取得しActionMapgetActionMap()それをバッファリングするだけのすべてのキーボード キーストロークのアクションを追加することです。その後、必要なときにいつでもそれらをディスパッチできます (たとえば、リターン キーの後)。

于 2010-06-11T00:06:20.853 に答える
1

Linux では JWindow がかなり壊れているようです。

回避策は、JFrame を とともに使用することsetUndecorated(true)です。

リグレッション: JWindow は他のすべてのウィンドウよりも前面に表示されたままになります

于 2010-06-11T01:12:11.240 に答える
-1

私もまったく同じ問題を抱えていました...私の解決策は、パッケージの1つのクラスで、キーリスナーが完全に機能するJFrameを拡張し、ペイントメソッドで...のグラフィックインスタンスを使用してペイントしたことでしwindow{Graphics g=win.getGraphics();}たJFrameではなくウィンドウ内のすべて...その前に、私はすでに呼び出しを行っていましたgd{graphicsdevice}.setFullScreenWindow(win);

于 2010-08-13T02:08:57.463 に答える