Кнопка Escape с Jpanel или JFrame или диалогом - PullRequest
3 голосов
/ 30 января 2012

Я создаю приложение, в котором любой открытый Jpanel или JFrame или Диалог должен быть закрыт при нажатии Escape кнопки клавиатура.

Если я открываю любую панель и нажимаю кнопку Escape прямого нажатия, чтобы она успешно закрывалась без проблем ... но когда я пытаюсь закрыть ее с помощью клавиши Escape после выполнения чего-либо в этом JPanel, JFrame или Dialog, она не может закрыться .

Пожалуйста, помогите мне, если я что-то делаю неправильно

Заранее спасибо ...

Мой метод

public static void addKeyBinding(JComponent c, final Object promptControl) {
         debugLogger.debug("Start Escape Key Binding ");

         Action escape = new AbstractAction() {

             {
                 putValue(NAME, "escape");
             }

             public void actionPerformed(ActionEvent e) {
                 try {
                     JComponent source = (JComponent) e.getSource();
                     Window window = SwingUtilities.getWindowAncestor(source);
                     window.dispose();
                     Dialog dialog = (Dialog) source.getFocusCycleRootAncestor();
                     dialog.dispose();
                     debugLogger.debug("source = " + source.getClass().getName() 
                             + "\n"
                             + "source.focusCycleRootAncestor = "
                             + source.getFocusCycleRootAncestor().getClass().getName());
                 } catch (Exception ex) {
                     errorLogger.error("Exception caught while closing the window." + x.toString());
                 }
             }
         };
         Object name = escape.getValue(Action.NAME);
         c.getInputMap().put(KeyStroke.getKeyStroke("ESCAPE"), name);
         c.getActionMap().put(name, escape);
         debugLogger.debug("End Escape Key Binding ");
     }

Ответы [ 2 ]

3 голосов
/ 30 января 2012

1) Используйте CardLayout вместо создания группы контейнеров верхнего уровня во время выполнения

2) Повторно используйте Top-Level Containers, удалив его содержимое, поскольку эти контейнеры представлены в памяти

3) если вы будете повторно использовать JDialogs , тогда вам нужно будет позвонить только setVisible(true/fasle), лучше было бы перенести видимость в invokeLater(), чтобы добавить это событие в EDT

EDIT

window/dialog.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
   .put(KeyStroke.getKeyStroke("ESC"), "myAction");
window/dialog.getRootPane().getActionMap().put("myAction", new AbstractAction() {...});
0 голосов
/ 20 января 2013
    getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
            KeyStroke.getKeyStroke("ESCAPE"), "closeTheDialog");
    getRootPane().getActionMap().put("closeTheDialog",
            new AbstractAction() {

                private static final long serialVersionUID = 8360999630557775801L;

                @Override
                public void actionPerformed(ActionEvent e) {
                    //This should be replaced by the action you want to perform
                    cancel.doClick();
                }
            });

С этим было отсортировано.Спасибо mKorbel

...