Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing:按下ESC键时如何关闭对话框?_Java_User Interface_Swing - Fatal编程技术网

Java Swing:按下ESC键时如何关闭对话框?

Java Swing:按下ESC键时如何关闭对话框?,java,user-interface,swing,Java,User Interface,Swing,使用Swing进行GUI开发 我有一个自定义对话框,用于选择要在应用程序中打开的文件;它的类扩展了javax.swing.JDialog,并包含一个JFileChooser,可以切换为显示或隐藏 JFileChooser组件已经自己处理ESC键:当显示文件选择器(嵌入到我的对话框中)并且我按下ESC键时,文件选择器隐藏自己 现在,我希望我的对话框也这样做:当我按ESC键时,我希望对话框关闭。请注意,当显示嵌入式文件选择器时,ESC键只应将其隐藏 有什么想法吗?使用InputMap和ActionM

使用Swing进行GUI开发

我有一个自定义对话框,用于选择要在应用程序中打开的文件;它的类扩展了
javax.swing.JDialog
,并包含一个
JFileChooser
,可以切换为显示或隐藏

JFileChooser
组件已经自己处理ESC键:当显示文件选择器(嵌入到我的对话框中)并且我按下ESC键时,文件选择器隐藏自己

现在,我希望我的对话框也这样做:当我按ESC键时,我希望对话框关闭。请注意,当显示嵌入式文件选择器时,ESC键只应将其隐藏


有什么想法吗?

使用
InputMap
ActionMap
处理Swing中的关键动作。要干净地关闭对话框,请向其发送窗口关闭事件

从我的:


您可以使用以下代码段。这更好,因为根窗格将从对话框中的任何组件获取事件。如果需要,可以将setVisible(false)替换为dispose()

public static void addEscapeListener(final JDialog dialog) {
    ActionListener escListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            dialog.setVisible(false);
        }
    };

    dialog.getRootPane().registerKeyboardAction(escListener,
            KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
            JComponent.WHEN_IN_FOCUSED_WINDOW);

}

如果您正在寻找使用Java 8新功能的技术,请尝试lambda表达式:

dialog.getRootPane().registerKeyboardAction(e -> {
    window.dispose();
}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);


我在实现这两个顶级答案时都遇到了问题。下面是一个相当紧凑的版本,它使用
AbstractAction
自动实现了大多数
Action
的方法,这些方法在基于文本的字段中工作(根据@pratikabu的请求):

工具书类
  • 以上答案
    • 这是我的,我还将CtrlW添加为结束shorcut

          Action closeAction = new AbstractAction(){
              public void actionPerformed(ActionEvent e){
                  dispose();
              }
          };
      
          KeyStroke esc = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0);
          getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(esc, "closex");
          getRootPane().getActionMap().put("closex", closeAction);
      
          KeyStroke ctrlW = KeyStroke.getKeyStroke("control W");
          getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ctrlW, "close");
          getRootPane().getActionMap().put("close", closeAction); 
      

      听起来不错。我只是用一些代码替换dialog.setVisible(false)来实际取消对话框。我会试一试。@Tom您好,谢谢您的精彩帖子,如果对话框中有任何文本库组件,您能告诉我最佳做法吗。因为如果把重点放在他们身上,这是行不通的。给别人留个小纸条。我发现,如果您不进行
      转义
      最终
      ,那么您将得到一个异常。我的IDE中没有显示必须是
      final
      。运行时出现异常。
      KeyStroke k = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
      int w = JComponent.WHEN_IN_FOCUSED_WINDOW;
      dialog.getRootPane().registerKeyboardAction(e -> window.dispose(), k, w);
      
      final AbstractAction escapeAction = new AbstractAction() {
          private static final long serialVersionUID = 1L;
      
          @Override
          public void actionPerformed(ActionEvent ae) {
              dispose();
          }
      };
      
      getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
              .put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "ESCAPE_KEY");
      getRootPane().getActionMap().put("ESCAPE_KEY", escapeAction);
      
          Action closeAction = new AbstractAction(){
              public void actionPerformed(ActionEvent e){
                  dispose();
              }
          };
      
          KeyStroke esc = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0);
          getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(esc, "closex");
          getRootPane().getActionMap().put("closex", closeAction);
      
          KeyStroke ctrlW = KeyStroke.getKeyStroke("control W");
          getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ctrlW, "close");
          getRootPane().getActionMap().put("close", closeAction);