Java 用于比较的VK代码+;和其他移位字符

Java 用于比较的VK代码+;和其他移位字符,java,swing,keylistener,Java,Swing,Keylistener,我正在创建一个带有标签的计算器,以显示用户从键盘输入的内容 当用户按下键盘上的“+”按钮时,问题就出现了,因为键盘上的“+”是(Shift+'=')。KeyEvent的getKeyChar()和getKeyCode()方法解释为两个独立的ASCI(一个是16,另一个是61) 下面的屏幕截图显示了按下Shift+'='生成加号时的getKeyCode()输出: 这与你的怀疑非常相似,希望这能帮你解决问题 class DispatcherListener implements KeyEventDis

我正在创建一个带有标签的计算器,以显示用户从键盘输入的内容

当用户按下键盘上的“+”按钮时,问题就出现了,因为键盘上的“+”是(Shift+'=')。KeyEvent的
getKeyChar()
getKeyCode()
方法解释为两个独立的ASCI(一个是16,另一个是61)

下面的屏幕截图显示了按下Shift+'='生成加号时的
getKeyCode()
输出:


这与你的怀疑非常相似,希望这能帮你解决问题

class DispatcherListener implements KeyEventDispatcher{
    private int level=0;

    public boolean dispatchKeyEvent(KeyEvent e) {
        if(e.getID() == KeyEvent.KEY_RELEASED){
            if(e.isControlDown() && e.isShiftDown()){
                if(this.level==0 && e.getKeyCode()==KeyEvent.VK_S){
                    level++;
                }else if(this.level==1 && e.getKeyCode()==KeyEvent.VK_H){
                    level++;
                }else if(this.level==2 && e.getKeyCode()==KeyEvent.VK_O){
                    level++;
                }else if(this.level==3 && e.getKeyCode()==KeyEvent.VK_W){
                    level=0;
                    this.showHiddenWindow((JFrame)SwingUtilities.getRoot(e.getComponent()));
                }else{
                    level=0;
                }

                //System.out.println( "level: " +  level );
            }
        }
        return false;
    }
并将其用作:

KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher( new DispatcherListener());

为什么不通过测试键盘事件来捕获键入的字符,这样“+”号就可以来自数字pa,而不仅仅是“Shift”和“+”组合

例如,类似于:

public boolean dispatchKeyEvent(KeyEvent event) {
    int eventID = event.getID();
    if (eventID == KeyEvent.KEY_TYPED) {
      char key = event.getKeyChar();
      if (key == '+') {
         /// Continue here...
         System.out.println("++++");
      }
    }
}
--编辑:这是一个完整的示例(简化自)

如果尝试键入“Shift”+“+”,则显示的字符应为“+”


注意

不要对Swing JComponents使用Keylistener(但确保可以确定键盘上的位置、numpad、带修饰符等,阅读Oracle教程了解工作代码示例)使用KeyBindings而不是DispatcherListener只是一个类名,请根据您的需要随意更改名称。它不会将其与+号进行比较。因为它显示shift和等号的ascii,我的意思是它分别读取shift和等号,而不是将其读取为shift+'='奇怪:当我测试它时,我在比较时得到了'+'号。在调用event.getKeyChar()方法(而不是按下或释放键)之前,您是否测试event.eventId值是否为KeyEvent.KeyChar类型?
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class KeyEventTest extends JPanel implements KeyListener, ActionListener {
  JTextArea displayArea;

  JTextField typingArea;

  static final String newline = "\n";

  public KeyEventTest() {
    super(new BorderLayout());

    JButton button = new JButton("Clear");
    button.addActionListener(this);

    typingArea = new JTextField();
    typingArea.addKeyListener(this);

    displayArea = new JTextArea();
    displayArea.setEditable(false);
    JScrollPane scrollPane = new JScrollPane(displayArea);
    scrollPane.setPreferredSize(new Dimension(375, 125));

    add(typingArea, BorderLayout.PAGE_START);
    add(scrollPane, BorderLayout.CENTER);
    add(button, BorderLayout.PAGE_END);
  }

  /** Handle the key typed event from the text field. */
  public void keyTyped(KeyEvent e) {
    displayInfo(e, "KEY TYPED: ");
  }

  /** Handle the key pressed event from the text field. */
  public void keyPressed(KeyEvent e) {
  }

  /** Handle the key released event from the text field. */
  public void keyReleased(KeyEvent e) {
  }

  /** Handle the button click. */
  public void actionPerformed(ActionEvent e) {
    displayArea.setText("");
    typingArea.setText("");
    typingArea.requestFocusInWindow();
  }

  protected void displayInfo(KeyEvent e, String s) {
    String typedKey = null;
    int id = e.getID();
    if (id == KeyEvent.KEY_TYPED) {
      char c = e.getKeyChar();
      typedKey = "key character = '" + c + "'";
    } 
    displayArea.append(s + newline + "    " + typedKey + newline);
    displayArea.setCaretPosition(displayArea.getDocument().getLength());
  }

  /**
   * Create the GUI and show it. For thread safety, this method should be
   * invoked from the event-dispatching thread.
   */
  private static void createAndShowGUI() {
    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame("KeyEventDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JComponent newContentPane = new KeyEventTest();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI();
      }
    });
  }
}