Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закрыть диалог по нажатию ESCAPE, Как закрыть диалог по esc? 
V
    Опции темы
coderinside
Дата 7.7.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Подскажите как сделать так, чтобы модальный диалог закрывался по нажатию кнопки ESCAPE.
PM MAIL WWW ICQ   Вверх
nornad
Дата 7.7.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



Код

KeyAdapter cancel = new KeyAdapter() {
    public void keyPressed( KeyEvent e ) {
        if ( e.getKeyCode() == KeyEvent.VK_ESCAPE )
            doCancel(); // ну или сразу System.exit() какой-нибудь
    }
};



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
coderinside
  Дата 7.7.2007, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Да, но это будет работать только для компонента на котором установлен фокус ввода. А как сделать чтобы отслеживалось нажатие ESC для диалога в целом. Чтобы без разницы было что сейчас в фокусе?
PM MAIL WWW ICQ   Вверх
_Michael
Дата 7.7.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 23.6.2007
Где: з полонини

Репутация: 1
Всего: 6



coderinside не вижу никаких проблем smile. Имплементируеш в классе твоего диалога Keylistener, и в нем метод keyPressed реализируеш примерно так:
Код

    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_ESCAPE)
            dispose();
    }


Только не забудь в конструкторе вписать this.addKeyListener(this); иначе твой диалог никаких клавиш слушать не будет smile
Только-что испробовал, етот вариант проходит когда никаких контролов в диалоге нет. Если ж оные имеются, тогда наверное надо на каждый контрол повешать один и тот же KeyListener, который бы при нажатии ESC закрывал твой диалог.

Это сообщение отредактировал(а) _Michael - 7.7.2007, 22:40


--------------------
...не убивайся ни о чем - все временно,
хоть ночь темна но светлым днем беременна...

Саади
PM MAIL   Вверх
nornad
Дата 8.7.2007, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



Цитата(coderinside @  8.7.2007,  00:18 Найти цитируемый пост)
Чтобы без разницы было что сейчас в фокусе?

Цитата(_Michael @  8.7.2007,  00:49 Найти цитируемый пост)
Только не забудь в конструкторе вписать this.addKeyListener(this);

Я и подразумевал, что KeyAdapter проставляется диалогу. Лично у меня этот код работает прекрасно.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
w1nd
Дата 8.7.2007, 01:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 23
Всего: 54



Свои клавиатурные слушатели в этом случае совершенно ни к чему, не нужно изобретать этот велосипед снова. Регистрировать обработчик клавиатуры для компонента, если он должен срабатывать вне зависимости от текущей принадлежности фокуса, нужно так:

Код
yourComponent.getActionMap().put("myAction", new AbstractAction() {
    public void actionPerformed(ActionEvent event) {
        // perform your action
    }
});

yourComponent.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
    KeyStroke.getKeyStroke("ESCAPE"), "myAction"
);


Или, на худой конец, так:

Код

ActionListener listener = new ActionListener() {
    public void actionPerformed(ActionEvent event) {
        // perform your action
    }
}; 
        
yourComponent.registerKeyboardAction(
    listener, KeyStroke.getKeyStroke("ESCAPE"), JComponent.WHEN_IN_FOCUSED_WINDOW
);

Второй вариант - на деле обёртка первого.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
nornad
Дата 8.7.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



w1nd, если не трудно, расскажи, почему такой вариант предпочтительнее. Есть подозрения, но хотелось бы услышать из уст знающего. А доку копать пока не сильно тянет. smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
w1nd
Дата 8.7.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 23
Всего: 54



Цитата(nornad @ 8.7.2007,  10:51)
w1nd, если не трудно, расскажи, почему такой вариант предпочтительнее. Есть подозрения, но хотелось бы услышать из уст знающего. А доку копать пока не сильно тянет. smile

Хотя бы  потому, что всё уже реализовано ;)
А вообще, вот:
  • Не нужно иметь доступ к объектам-контейнерам компонента и другим компонентам, чтобы обработать событие на уровне окна.
  • Простой и удобный способ изменения поведения компонента в зависимости от окружения.
  • InputMap'ы и ActionMap'ы можно использовать повторно, компоненты могут использовать их совместно. 
  • От компонента всегда можно получить список обрабатываемых им клаиатурных комбинаций с описанием действий, ими вызываемых.
  • Можно расширить или изменить реакцию компонента на ту или иную клавиатурную комбинацию; отключить реакцию на некоторые комбинации; напрямую вызывать зарегистрированные action'ы. 
  • Зарегистрированные таким образом комбинации всегда обрабатываются корректно - не нужно в обработчике проверять наличие фокуса, состояние флага enabled и т. п.
  • Корректное взаимодействие с имеющимися компонентами вроде текстовых полей, кнопок по умолчанию.



--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.