如何正确可靠地识别“Alt+”按键?

Ken*_*ald 6 java keyboard awt

我的问题实际上更笼统,但我使用用户按住“Alt”键并按“+”的操作作为显示困难的示例。

\n\n

我正在使用美式英语键盘,该键盘在同一个键上有“=”(小写)和“+”(大写),因此要按“Alt +”(如菜单项中所示),我实际上必须按“Alt Shift =”。在 Java AWT 中,按“Alt Shift =”会生成一个按键 KeyEvent,其键码与“=”键关联,以及一个包含“\xc2\xb1”字符的键类型 KeyEvent。因此,没有明显、可靠的方法来以编程方式确定按下“+”键时按住“Alt”。

\n\n

我可以在内部进行一些映射来解决此问题,例如将“\xc2\xb1”映射到“Alt +”,或将“Shift {keycode for = }”映射到“+”。然而,似乎没有任何保证这可以在不同的键盘布局上工作;这当然不是好的编码风格。

\n\n

如果有人可以提出解决这些问题的方法,或者指出已经解决了这个困难的代码,我将不胜感激。

\n\n

谢谢。

\n

Fav*_*ius 2

尝试这个:

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

e哪里KeyEvent并且它是在keyPressed方法中处理的。

当您在指定的键盘上按+ +时,上面的代码将打印Plus 。ALTShift=

有关完整的工作代码,请参阅以下示例:

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);
            }
        });         
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助。