今天一同學問我,他做桌面系統的時候想使用熱鍵,如何使用!事實上JDK給我們提供了幾種簡單的複合鍵的應用(參考InputEvent類)alt+、ctrl+,不過這種複合鍵明顯有侷限性!若是用戶想自定義熱鍵,JDK提供給我們的就無法實現了!於是我就自己做了一個複合鍵監聽器。
代碼如下所示:
實際上監聽器只是有這麼一個作用而已,當鍵盤被按下時,監聽器會將按下的keycode值保存到集合中,鍵盤被釋放時,該keycode被移除!同時也保證了集合中的keycode不重複和順序!
如何使用該監聽器?主函數裏頭有!
import java.awt.Container;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public abstract class MultiKeyListener implements KeyListener {
private List<Integer> codeList = new ArrayList<Integer>();
@Override
public final void keyTyped(KeyEvent e) {
}
@Override
public final void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(!codeList.contains(keyCode)) {
codeList.add(keyCode);
}
this.onPressed(codeList, e);
}
@Override
public final void keyReleased(KeyEvent e) {
for(int i = 0, n = codeList.size() ; i < n ; i++) {
if(e.getKeyCode() == codeList.get(i)) {
codeList.remove(i);
break;
}
}
}
protected abstract void onPressed(List<Integer> codeList, KeyEvent event);
public static void main(String[] args) {
final JFrame frame = new JFrame() {};
Container c = frame.getContentPane();
JTextArea area = new JTextArea();
c.add(area);
area.addKeyListener(new MultiKeyListener() {
private List<Integer> closeQuick = new ArrayList<Integer>();
{
closeQuick.add(KeyEvent.VK_ALT);
closeQuick.add(KeyEvent.VK_A);
closeQuick.add(KeyEvent.VK_B);
}
@Override
protected void onPressed(List<Integer> codeList, KeyEvent event) {
//實現alt+a+b輸出“關閉程序”
if(codeList.equals(closeQuick)) {
System.out.println("程序關閉......");
}
}
});
frame.setVisible(true);
}
}