在 java 中注册热键(处理中)

Register hotkeys in java (processing)

在 java 中创建高效的热键注册功能的最佳方法是什么?我不太期待为此使用库或其他附加组件,因为它看起来很容易编码,但我非常关心代码的效率,所以请纠正我是否可以更好。

这是我的代码思路:

Kyeboard my_keyboard;

class Keyboard{
 boolean control, alt, shift;
 boolean a, b, c, d;  // ... x,y,z; here other needed letters can be declared

 Keyboard(){

 }
} 

void setup(){  // This gets executed only once, a built-in function in processing
 my_keyboard=new Keyboard();
}

void keyPressed(){  // Another built in function in processing, detects when a key is pressed
 switch(keyCode){   
  case 18:
  my_keyboard.alt=true;
  break;

  case 17:
  my_keyboard.control=true;
  break;
 
  case 16:
  my_keyboard.shift=true;
  break;

  //...
 }
}

void keyReleased(){  // Again a built-in function
 switch(keyCode){
  case 18:
  my_keyboard.alt=false;
  break;

  case 17:
  my_keyboard.control=false;
  break;

  case 16:
  my_keyboard.shift=false;
  break;

  //...
 }
} 

如果您使用数组,根据键码编制索引,则可以存储每个键的状态,而不必像您那样在一个巨大的开关盒中显式列出它们。

boolean[] keys = new boolean[256];

void keyPressed(){  
  keys[keyCode] = true;
}

void keyReleased() {
  keys[keyCode] = false;
}

Cadin 的回答很棒 (+1),该技术在制作需要快速更新的视频游戏时特别有用。

如果您想编写类似于应用程序快捷方式的代码(例如 Ctrl + Shift + S 触发 另存为... Windows 等)您还可以确保 KeyEvent 覆盖 keyPressed()/keyReleased()(例如 keyPressed(KeyEvent key)keyReleased(KeyEvent key);)。

这是一个基本的 Windows 示例:

void setup(){
  size(300, 300);
}

void draw(){
  background(0);
}

void keyReleased(KeyEvent event){
  println("keyCode",event.getKeyCode(),"control",event.isControlDown(), "alt", event.isAltDown(), "shift", event.isShiftDown());
  // Ctrl + Shift + S
  if(event.getKeyCode() == 83 && event.isShiftDown() && event.isControlDown()){
    println("Save As...");
  }
  // Ctrl + Alt + J
  if(event.getKeyCode() == 74 && event.isAltDown() && event.isControlDown()){
    println("Step Out");
  }
}

OSX 快捷方式可能略有不同,但您可以先检查 platform 属性。 (例如 if(platform == MACOSX){...} / if(platform == WINDOWS){...}