在 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){...}
)
在 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){...}
)