0

我正在实现一些扩展 JDialog 的对话框窗口,并且需要实现一些键盘快捷键,例如:

class MyDialog extends JDialog implements KeyListener
{
    /** Constructor
     * 
     */
    public MyDialog() {

        super();

        // add keyboard shortcuts:
        addKeyListener(this);
        setFocusable(true);
    }

    // ---------------------------------------------------------
    //                 Keyboard shortcuts
    // ---------------------------------------------------------
    public void keyReleased(KeyEvent e) {}
    public void keyTyped(KeyEvent e) {}
    public void keyPressed(KeyEvent e)
    {
        System.out.println(e);
        if ((e.getKeyCode() == KeyEvent.VK_W) && ((e.getModifiers() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0)) {
            dispose();
        }
    }
}

然后我有几个不同类型的对话框,它们扩展了 MyDialog。当键盘快捷键被触发时,我在控制台上得到以下输出:

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=157,keyText=?,keyChar=Undefined keyChar,modifiers=?,extModifiers=?,keyLocation=KEY_LOCATION_LEFT,rawCode=0,primaryLevelUnicode=0,scancode=0] on dialog0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=87,keyText=W,keyChar='w',modifiers=?,extModifiers=?,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on dialog0
2013-02-10 19:24:28.716 java[10029:2707] Attempt to call non-applicable method "keyCode" on SyntheticEvent!
2013-02-10 19:24:28.718 java[10029:2707] (
    0   CoreFoundation                      0x00007fff90e5f0a6 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff9617b3f0 objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff90e5ee7c +[NSException raise:format:] + 204
    3   libawt.jnilib                       0x0000000110e3564b -[SyntheticEvent keyCode] + 58
    4   libawt.jnilib                       0x0000000110e397a4 -[NSViewAWT performKeyEquivalent:] + 507
    5   AppKit                              0x00007fff938793c9 -[NSView _performKeyEquivalent:conditionally:] + 41
    6   AppKit                              0x00007fff93879512 -[NSView performKeyEquivalent:] + 166
    7   AppKit                              0x00007fff938793c9 -[NSView _performKeyEquivalent:conditionally:] + 41
    8   AppKit                              0x00007fff93879329 -[NSWindow performKeyEquivalent:] + 64
    9   AppKit                              0x00007fff93879114 -[NSApplication _handleKeyEquivalent:] + 462
    10  AppKit                              0x00007fff93c29232 -[NSWindow keyDown:] + 89
    11  Foundation                          0x00007fff91965677 __NSThreadPerformPerform + 225
    12  CoreFoundation                      0x00007fff90dde101 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    13  CoreFoundation                      0x00007fff90dddaed __CFRunLoopDoSources0 + 445
    14  CoreFoundation                      0x00007fff90e00dc5 __CFRunLoopRun + 789
    15  CoreFoundation                      0x00007fff90e006b2 CFRunLoopRunSpecific + 290
    16  HIToolbox                           0x00007fff8b4430a4 RunCurrentEventLoopInMode + 209
    17  HIToolbox                           0x00007fff8b442e42 ReceiveNextEventCommon + 356
    18  HIToolbox                           0x00007fff8b442cd3 BlockUntilNextEventMatchingListInMode + 62
    19  AppKit                              0x00007fff93655613 _DPSNextEvent + 685
    20  AppKit                              0x00007fff93654ed2 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128
    21  libawt.jnilib                       0x0000000110de6fcf -[NSApplicationAWT nextEventMatchingMask:untilDate:inMode:dequeue:] + 124
    22  AppKit                              0x00007fff9364c283 -[NSApplication run] + 517
    23  libawt.jnilib                       0x0000000110de5680 +[AWTStarter startAWT:] + 1495
    24  libawt.jnilib                       0x0000000110de4ffa -[CPerformer perform] + 93
    25  Foundation                          0x00007fff91965677 __NSThreadPerformPerform + 225
    26  CoreFoundation                      0x00007fff90dde101 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    27  CoreFoundation                      0x00007fff90ddda25 __CFRunLoopDoSources0 + 245
    28  CoreFoundation                      0x00007fff90e00dc5 __CFRunLoopRun + 789
    29  CoreFoundation                      0x00007fff90e006b2 CFRunLoopRunSpecific + 290
    30  java                                0x0000000107c97843 java + 18499
    31  java                                0x0000000107c9729a java + 17050
    32  java                                0x0000000107c94a98 java + 6808
)

前两件事是 println 语句,这似乎是正常的。我不知道 SyntheticEvent 的含义是什么,并且在 Google 上没有成功。谁能指出我正确的方向 - 这有什么问题?此后窗口正常配置。

谢谢!

4

1 回答 1

1

不知道那个输出是从哪里来的。

不要将 KeyListener 用于此类功能。看:

  1. 如何使用菜单,或
  2. 如何使用键绑定
于 2013-02-11T01:25:36.607 回答