【问题标题】:How to identify "Alt +" keypress, properly and reliably?如何正确可靠地识别“Alt +”按键?
【发布时间】:2011-07-24 01:14:01
【问题描述】:

我的问题实际上更笼统,但我以用户按住“Alt”键并按“+”的动作为例说明了困难。

我正在使用美式英语键盘,它在同一个键上具有“=”(小写字母)和“+”(大写字母),因此按“Alt +”(可能在菜单条目中指示),我必须实际按下“Alt Shift =”。在 Java AWT 中,按下“Alt Shift =”会生成一个按键式 KeyEvent,其键码与“=”键相关联,以及一个包含“±”字符的按键式 KeyEvent。因此,没有明显、可靠的方式以编程方式确定在按下“+”键时按住“Alt”。

我可以在内部进行一些映射来解决此问题,例如将“±”映射到“Alt +”,或将“Shift {keycode for = }”映射到“+”。但是,似乎无法保证这可以在不同的键盘布局中使用。这当然不是好的编码风格。

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

谢谢。

【问题讨论】:

  • 您需要决定是否想知道哪些键已被按下或哪些键已被键入。通常,您应该检测键入的键,因为键入的键所按下的键在不同的键盘上发生变化,并且通常您需要知道何时键入键(按下和释放键),而不仅仅是何时按下并且用户可以按住键一段时间。
  • 嗨,大卫,感谢您的回复。我同意监控“keyTyped”是最好的,但就像我说的那样,这并不能识别用户在键盘上看到的实际字符,这是我想要做的。
    此外,处理一些事情像“Alt-e”是有问题的,因为它不会在按键上调用 keyTyped,并且通过 keyTyped 监控“Alt-e Alt-”的按下真的很痛苦,因为这会产生重音字符。

标签: java keyboard awt


【解决方案1】:

试试这个:

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

其中eKeyEvent,在keyPressed方法中处理。

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

完整的工作代码见下面的例子:

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

希望这会有所帮助。

【讨论】:

  • 您好 Favonius,感谢您的详细回答。但是,这在我的系统上不起作用(OS X 10.6,Java 6 在 OS X 上的最新更新),所以我修改了代码以摆脱开关并简单地执行“System.out.println(e.getKeyChar( ));"与我的 Scala 代码的情况一样,打印出来的字符是“±”(这是一个小的 +,紧接在一个小 - 的上方;“加号或减号”数学符号)。叹息。
  • @Kenneth McDonald:该演示是在装有 Java 1.6_b18(不是当前版本)的 Win Vista 机器上编写的。不确定OS X。会再研究一段时间。
  • 我不会担心的;苹果可能添加了一个键盘映射层,我必须深入研究,无论如何,这对我来说不是一个阻碍。我有点期待 JavaFX 2 最终会成为我所针对的实际 UI 工具包,因此在 JFX 2 上市之前,使用 AWT 只是权宜之计。我非常感谢您抽出宝贵的时间,但没有理由让您花更多时间在对您没有好处的事情上。
猜你喜欢
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多