Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > ActionMap и InputMap


Автор: newbie2 6.6.2008, 11:15
Есть 2 диалога.
Я при помощи сабжа, регистрирую хоткей, чтобы при нажатии на Enter открывалось второе окно. http://www.everfall.com/paste/id.php?8e7j9xlrd5ir

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

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

2) Что нужно сделать, чтобы после нажатия Enter-ом во втором окне, action в первом не срабатывал?

Автор: fixxer 6.6.2008, 11:24
Код можно увидеть?

Автор: newbie2 6.6.2008, 12:21
Код

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);
    }
}

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

не так.
что бы сработала кнопка надо нажать пробел

Автор: newbie2 6.6.2008, 13:41
В данном случае, не важно, чтобы именно нажималась кнопка.
При нажатии на Enter или при щелчке мышью по кнопке вызывается один и тот же метод, который в конце вызывает dispose().
Пользователю удобнее нажимать enter, но это почему-то приводит к вызову action-а в MainDialog.
Я думал, что Action действует только в рамках MainDialog, а, выясняется, что тут вмешивается в работу нажатие Enter в PopupDialog.
Видимо, перед dispose() нужно что-то очищать, чтобы Enter  не передавался? Или как?

Автор: dorogoyIV 7.6.2008, 14:48
замени 19 строку и все
Код

            public void keyReleased(KeyEvent e) {

Автор: newbie2 7.6.2008, 16:18
Ага.
Другое решение было найдено http://forum.juga.ru/showthread.php?s=&threadid=17782&perpage=15&pagenumber=1..
Мне оно больше подошло для моих задач...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)