Java Swing: почему перетаскивание в JFrame вызывает акселератор Ctrl+C?

Создаю JFrame и помещаю в него JMenuBar, добавляется пункт меню "Копировать" с ускорителем "Ctrl+C". Полный исходный код вставлен ниже. Когда я перетаскиваю в JFrame, я вижу, что срабатывает ускоритель «Ctrl + C» (поскольку ActionEvent печатается в консоли), что точно так же, как вы нажимаете Ctrl + C на клавиатуре.

Я думаю, что это довольно странное поведение, и я не мог понять, почему манипуляции с мышью вызывают эту горячую клавишу. Это ошибка?

public class Test {
    public static void main(String[] args) {
        final JFrame jf = new JFrame("Test");
        final JMenuBar menuBar = new JMenuBar();
        jf.setJMenuBar(menuBar);
        final JMenu menu = new JMenu("Edit");
        menuBar.add(menu);
        final JMenuItem copyItem = new JMenuItem("Copy");
        copyItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println(e);
            }
        });
        copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK));
        menu.add(copyItem);
        jf.setPreferredSize(new Dimension(400, 300));
        jf.pack();
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
    }
}

person Xavier Young    schedule 18.07.2011    source источник
comment
Это работает с кодом, который вы разместили? Просто спрашиваю, потому что в последний раз, когда я пробовал перетаскивание в Java, потребовалось довольно много кода с использованием TransferHandler.   -  person James P.    schedule 18.07.2011
comment
I второе заявление Джеймса. Я не могу воспроизвести вашу проблему с опубликованным выше кодом, возможно, потому, что он не позволяет перетаскивать.   -  person Hovercraft Full Of Eels    schedule 18.07.2011
comment
Я использую систему Windows XP, и эта проблема может быть воспроизведена в JRE 1.5 или 1.6 (я не пробовал 1.4).   -  person Xavier Young    schedule 18.07.2011
comment
Вы должны быть в состоянии воспроизвести проблему только с кодом, который я разместил выше, вам просто нужно нажать левую кнопку мыши, немного переместить ее, затем отпустить кнопку мыши в области JFrame, вы увидите, что происходит в консоли.   -  person Xavier Young    schedule 18.07.2011
comment
Я использую JDK6_07 на XP и не могу воспроизвести описанное вами поведение. Я понятия не имею, почему это произойдет на любой версии ОС Java.   -  person camickr    schedule 18.07.2011
comment
Спасибо, ребята, за ответы. Я только что подтвердил, что это вызвано инструментом словаря, который я использую. Я предполагаю, что это реализовано как жест мыши. Так что на самом деле это не вопрос программирования.   -  person Xavier Young    schedule 18.07.2011


Ответы (1)


Несколько дней назад у меня была аналогичная проблема. Но я решил это, изменив параметр Event.CTRL_MASK на KeyEvent.CTRL_DOWN_MASK. Мой окончательный код был следующим:

   sousMenu = new JMenuItem("Nouveau", KeyEvent.VK_N);
   sousMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
                                         KeyEvent.CTRL_DOWN_MASK));
   sousMenu.setName(Modele.ID_NOUVEAU);
   sousMenu.addActionListener(this);
   menu.add(sousMenu);
   /** Modele is a singleton class with my constants
    *  My frame class implements ActionListener
    *  The KeyEvent.VK_N parameter in the constructor sets the mnemonic
    */

Не знаю, известный ли это баг, но мой вариант работает в моем случае без проблем.

Удачи!

person Charliemops    schedule 27.07.2011