1

我试图在按 ESC 时关闭对话框,并在按 ENTER 时接受。因此,我使用 Input/ActionMap 构建了一个超类“CloseableDialog”,如下所示:

    getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "accept");
    getRootPane().getActionMap().put("accept", acceptAction);

    getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel");
    getRootPane().getActionMap().put("cancel", cancelAction);

现在我构建了几个扩展 CloseableDialog 的对话框。它在第一次时按方面工作(按 ESC 时关闭,按 ENTER 时接受),但是当我打开子对话框(对话框中的对话框)时,只有子对话框可以通过按 ESC 关闭(ESC -> 子对话框关闭,其他对话框可见 -> ESC-> 什么都没有发生)。

有任何想法吗?

我认为,处理后的 SubDialog 仍然可以获得另一个 Dialog 的输入,但我不确定。

4

2 回答 2

0

当组件聚焦时,快捷方式起作用。我认为焦点不在您之前打开的窗口中。尝试将焦点返回到您需要快捷方式正常工作的窗口。尝试在该窗口上单击并应用快捷方式。也许它会起作用。否则你必须处理焦点到窗口

于 2013-04-18T09:59:07.080 回答
0

我懂了!

阅读http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html告诉我,有三个 InputMap:

  • JComponent.WHEN_FOCUSED
  • JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  • JComponent.WHEN_IN_FOCUSED_WINDOW

通过调用 getRootPane.getInputMap() 我得到了“默认” WHEN_FOCUSED Inputmap,但是通过调用 Subdialog,rootPane 似乎失去了焦点,没有任何帮助让焦点恢复。

现在我正在使用 getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(...) 并且它有效。

我有点惊讶,在打开子对话框之前它一直有效。

于 2013-04-19T12:52:55.770 回答