Как правильно и надежно определить нажатие клавиши «Alt +»? - PullRequest
4 голосов
/ 28 марта 2011

Мой вопрос на самом деле более общий, но я использую действие пользователя, удерживающего клавишу «Alt» и нажимающего «+», в качестве примера, который показывает трудности.

Я работаю на американской английской клавиатуре, у которой "=" (нижний регистр) и "+" (верхний регистр) на одной клавише, поэтому нажимаю "Alt +" (как может быть указано в пункте меню). ), Я должен фактически нажать «Alt Shift =». В Java AWT нажатие «Alt Shift =» генерирует нажатие клавиши KeyEvent с кодом клавиши, связанным с клавишей «=», и набираемый клавишей KeyEvent, содержащий символ «±». Таким образом, не существует очевидного, надежного способа программного решения, что «Alt» удерживается, пока нажата клавиша «+».

Я мог бы сделать некоторое внутреннее сопоставление, чтобы исправить это, например сопоставление "±" с "Alt +" или сопоставление "Shift {keycode for =}" с "+". Однако, кажется, нет никаких гарантий, что это будет работать при разных раскладках клавиатуры; и это, конечно, не очень хороший стиль кодирования.

Если кто-то может предложить способ обойти эти проблемы или, возможно, указать код, который уже справился с этой трудностью, я был бы очень признателен.

Спасибо.

1 Ответ

1 голос
/ 28 марта 2011

Попробуйте:

if(e.isAltDown())
{
    switch(e.getKeyChar())
    {
        case '+':
            System.out.println("Plus");
        break;
    }
}

Где e - это KeyEvent, и он обрабатывается методом keyPressed.

Приведенный выше код будетнапечатайте Plus при нажатии ALT + Shift + = на указанной вами клавиатуре.

Для полной работыкод, см. пример ниже:

import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.UIManager;


public class SwingTest 
{

    private static JFrame frame;

    public static void main(String[] args) throws Exception
    {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            try {
                UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        frame = new JFrame("Event Test");

        Toolkit tk = Toolkit.getDefaultToolkit();  
        int xSize = ((int) tk.getScreenSize().getWidth()/2) + 100;  
        int ySize = ((int) tk.getScreenSize().getHeight()/2) + 50;  

        frame.setSize(xSize,ySize); 
        frame.setLocationRelativeTo(null); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.addKeyListener(new KeyListener() 
        {
            public void keyTyped(KeyEvent e) {
            }

            public void keyReleased(KeyEvent e) {
            }

            public void keyPressed(KeyEvent e) 
            {
                if(e.isAltDown())
                {
                    switch(e.getKeyChar())
                    {
                    case '+':
                        System.out.println("Plus");
                        break;
                    }
                }
            }
        });

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.setVisible(true);
            }
        });         
    }
}

Надеюсь, это поможет.

...