Java Swing Key База событий - PullRequest
5 голосов
/ 03 мая 2011

В одном из моих меню одна из горячих клавиш одного элемента меню -

Ctrl + Большой

код для этого - KeyEvent.VK_GREATER, Event.CTRL_MASK

но когда я нажимаю Ctrl + Больше не работает .... Кто-нибудь может предложить, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Думал, что это довольно старое недоразумение было исправлено .. очевидно, нет; -)

В прежние времена было безопасно использовать только нажатия клавиш, в которых VK_Something с Something доступен без смещения наамериканская раскладка клавиатуры.Это означает, что использование связывания клавиш с клавишами, положение которых (без смещения или даже с помощью gr) отличается от этой базы, либо сильно зависит от раскладки клавиатуры, либо крайне нестабильно - лучше не использовать.

   // technical binding to "Greater" on a German keyboard  
   other.setAccelerator(KeyStroke.getKeyStroke("control shift LESS"));

   // BUT ... not really, its localized description is
   Str-Umschalt-Kleiner als
1 голос
/ 03 мая 2011

Проверьте мой код.Здесь все в порядке.

Этот пример не подходит к проблеме, но я дал ее в первую очередь (и был недоволен), поэтому он оставлен здесь для справки.Для соответствующего, то есть установки акселератора в пункте меню, см. EDIT1 ниже.

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class CtrlGreaterTestInaccurateAnswer extends JFrame
{
    private static final long serialVersionUID = 1L;
    private KeyListener kL = new KeyAdapter()
    {
        @Override
        public void keyReleased(KeyEvent e)
        {
            super.keyReleased(e);
        System.out.println("keyReleased KeyEvent.VK_GREATER=" + KeyEvent.VK_GREATER
                + "; e.getKeyCode()=" + e.getKeyCode()
                + "; e.getKeyChar()=" + e.getKeyChar()
                + "; e.isControlDown()=" + e.isControlDown()
                + "; e.isShiftDown()=" + e.isShiftDown() 
                + "; (int)'.'="+(int)'.' +"; (int)'>'="+(int)'>');
        if(e.isControlDown()    && e.getKeyChar() == '>')
            System.out.println("keyReleased ctrl + greater");
        }
    };

    public CtrlGreaterTestInaccurateAnswer()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addKeyListener(kL);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                CtrlGreaterTestInaccurateAnswer f = new CtrlGreaterTestInaccurateAnswer();
                f.setSize(400, 400);
                f.setVisible(true);
            }
        });
    }
}

Из того, что я наблюдал, KeyEvent.VK_GREATER возвращает 160, и код возвращается при нажатии «>»46, то есть то же самое, что нажатие «.».Таким образом, если вы используете метод getKeyCode для обнаружения, у вас возникнет проблема:

EDIT1 (соответствующий пример): Установка ускорителя для CTRL +>.Обратите внимание, что по-прежнему ускоритель скажет Ctrl + Shift-PERIOD (Ctrl + Shift +.)

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class CtrlGreaterTest extends JFrame
{
    private static final long serialVersionUID = 1L;

    public CtrlGreaterTest()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMenuBar menuBar = new JMenuBar();
        JMenu menu1 = new JMenu("Menu1");
        JMenuItem menuItem1 = new JMenuItem();
        menuItem1.setAction(onCtrlGreaterAction);
        menuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, 
                KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK));         
        //or use this
        //menuItem1.setAccelerator(KeyStroke.getKeyStroke("ctrl shift PERIOD"));
        menu1.add(menuItem1);

        JMenuItem menuItem2 = new JMenuItem();
        menuItem2.setAction(onCtrlAAction);
        menuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, 
                KeyEvent.CTRL_MASK)); 

        System.out.println("KeyEvent.VK_PERIOD| KeyEvent.SHIFT_MASK="
                +(KeyEvent.VK_PERIOD| KeyEvent.SHIFT_MASK)
                + "; KeyEvent.VK_GREATER="+(KeyEvent.VK_GREATER) 
                + "; (int)'>'="+(int)'>');
        menu1.add(menuItem2);       
        menuBar.add(menu1);
        setJMenuBar(menuBar);
    }
    private AbstractAction onCtrlGreaterAction = new AbstractAction("CTRL + > Action")
    {
        private static final long serialVersionUID = 1L;

        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("onCtrlGreaterAction actionPerformed OI");
        }
    };

    private AbstractAction onCtrlAAction = new AbstractAction("CTRL + a Action")
    {
        private static final long serialVersionUID = 1L;

        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("onCtrlAAction actionPerformed AI");
        }
    };

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                CtrlGreaterTest f = new CtrlGreaterTest();
                f.setSize(400, 400);
                f.setVisible(true);
            }
        });
    }
}

Надеюсь, что это так:)

...