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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ActionMap и InputMap, и их поведение 
V
    Опции темы
newbie2
Дата 6.6.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть 2 диалога.
Я при помощи сабжа, регистрирую хоткей, чтобы при нажатии на Enter открывалось второе окно. код смотреть здесь

Нажимаю Enter на главном диалоге, открывается второй диалог.
Если Enter-ом закрыть второй диалог, action в первом диалоге сработает повторно, и опять вызовет второй диалог.

Вопрос:
1) Почему так происходит? (Если второму окну не задавать parent, поведение такое же)

2) Что нужно сделать, чтобы после нажатия Enter-ом во втором окне, action в первом не срабатывал?
PM MAIL   Вверх
fixxer
Дата 6.6.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код можно увидеть?


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


Новичок



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

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



Код

import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.*;

public class PopupDialog extends JDialog {
    private JPanel contentPane = new JPanel();
    private JButton buttonOK = new JButton("OK");

    public PopupDialog(Dialog parent) {
        super(parent, "PopupDialog");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setModal(true);
        
        setContentPane(contentPane);
        contentPane.add(buttonOK);

        buttonOK.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                dispose();
            }
        });

    }
}



Код

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

public class MainDialog extends JDialog {
    private JPanel contentPane = new JPanel();
    private JTable table1 = new JTable();

    private Action action = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            PopupDialog dlg = new PopupDialog(MainDialog.this);
            dlg.pack();
            dlg.setVisible(true);
        }
    };

    public MainDialog() {
        super((Dialog) null, "MainDialog");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setModal(true);

        setPreferredSize(new Dimension(100, 100));

        setContentPane(contentPane);
        contentPane.add(table1);

        ActionMap actMap = contentPane.getActionMap();
        InputMap inMap = contentPane.getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

        inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), "actEnter");
        actMap.put("actEnter", action);
    }

    public static void main(String[] params) {
        MainDialog dlg = new MainDialog();
        dlg.pack();
        dlg.setVisible(true);
    }
}


Это сообщение отредактировал(а) newbie2 - 6.6.2008, 12:57
PM MAIL   Вверх
dorogoyIV
Дата 6.6.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(newbie2 @  6.6.2008,  11:15 Найти цитируемый пост)
Если Enter-ом закрыть второй диалог, action в первом диалоге сработает повторно, и опять вызовет второй диалог.

не так.
что бы сработала кнопка надо нажать пробел
PM MAIL   Вверх
newbie2
Дата 6.6.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В данном случае, не важно, чтобы именно нажималась кнопка.
При нажатии на Enter или при щелчке мышью по кнопке вызывается один и тот же метод, который в конце вызывает dispose().
Пользователю удобнее нажимать enter, но это почему-то приводит к вызову action-а в MainDialog.
Я думал, что Action действует только в рамках MainDialog, а, выясняется, что тут вмешивается в работу нажатие Enter в PopupDialog.
Видимо, перед dispose() нужно что-то очищать, чтобы Enter  не передавался? Или как?
PM MAIL   Вверх
dorogoyIV
Дата 7.6.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



замени 19 строку и все
Код

            public void keyReleased(KeyEvent e) {

PM MAIL   Вверх
newbie2
Дата 7.6.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ага.
Другое решение было найдено по этой ссылке..
Мне оно больше подошло для моих задач...


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

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

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


 




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


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

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