青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

逛奔的蝸牛

我不聰明,但我會很努力

   ::  :: 新隨筆 ::  ::  :: 管理 ::

import java.awt.AWTEvent;

import java.awt.Component;

import java.awt.Toolkit;

import java.awt.event.AWTEventListener;

import java.awt.event.KeyEvent;

import java.util.Arrays;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Map;

import java.util.Set;


public class ShortcutManager implements AWTEventListener {

// 使用單態模式

private static ShortcutManager instance = new ShortcutManager();


// 快捷鍵與事件處理對象鍵值對

private Map<String, ShortcutListener> listeners;


// 某組件上發生了快捷鍵列表中的快捷鍵事件, 如果他的父組件在被忽略組件列表中, 則放棄這個事件.

private Set<Component> ignoredComponents;


// 保存鍵盤上鍵與它的ascii碼對應

// 如果以某鍵的ascii碼為下標, 數組中此下標的值為true, 說明此鍵被按下了.

// 當此鍵被釋放開后, 數組中對應的值修改為false

private boolean[] keys;


private ShortcutManager() {

keys = new boolean[256];

ignoredComponents = new HashSet<Component>();

listeners = new HashMap<String, ShortcutListener>();


// 只關心鍵盤事件

Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);

}


/**

* 有鍵盤事件發生

*/

public void eventDispatched(AWTEvent event) {

if (event.getClass() == KeyEvent.class) {

KeyEvent ke = (KeyEvent) event;


if (ke.getID() == KeyEvent.KEY_PRESSED) {

keys[ke.getKeyCode()] = true;


// 查找快捷鍵對應的處理對象, 然后調用事件處理函數

String shortcut = searchShortcut();

ShortcutListener l = listeners.get(shortcut);

if (l != null && !isIgnored(event)) {

l.handle();

}

} else if (ke.getID() == KeyEvent.KEY_RELEASED) {

keys[ke.getKeyCode()] = false;

}

}

}


protected String searchShortcut() {

// 每個鍵之間用一個"."來隔開.

// 例如ctr + x的對應值為"17.88."

StringBuilder shortcut = new StringBuilder();

for (int i = 0; i < keys.length; ++i) {

if (keys[i]) {

shortcut.append(i).append(".");

}

}

// System.out.println(shortcut.toString());

return shortcut.toString();

}


/**

* 查找此快捷鍵事件是否要被拋棄

* @param event

* @return

*/

protected boolean isIgnored(AWTEvent event) {

if (!(event.getSource() instanceof Component)) {

return false;

}


boolean ignored = false;

for (Component com = (Component) event.getSource(); com != null; com = com.getParent()) {

if (ignoredComponents.contains(com)) {

ignored = true;

break;

}

}


return ignored;

}


public static ShortcutManager getInstance() {

return instance;

}


public void removeShortcutListener(ShortcutListener l) {

String tempKey = null;

for (Map.Entry<String, ShortcutListener> e : listeners.entrySet()) {

if (e.getValue().equals(l)) {

tempKey = e.getKey();

}

}


listeners.remove(tempKey);

}


public void addShortcutListener(ShortcutListener l, int... keys) {

// 快捷鍵的對應值按它們的鍵順序大小來進行創建

StringBuilder sb = new StringBuilder();

Arrays.sort(keys);

for (int i = 0; i < keys.length; ++i) {

if (0 < keys[i] && keys[i] < this.keys.length) {

sb.append(keys[i]).append(".");

} else {

System.out.println("Key is not valid");

return;

}

}


String shortcut = sb.toString();


// 如果還不存在, 則加入

if (listeners.containsKey(shortcut)) {

System.out.println("The shourt cut is already used.");

} else {

listeners.put(shortcut, l);

}

}


public void addIgnoredComponent(Component com) {

ignoredComponents.add(com);

}


public void removeDiscardComponent(Component com) {

ignoredComponents.remove(com);

}


public static interface ShortcutListener {

void handle();

}

}


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

import java.awt.BorderLayout;

import java.awt.event.KeyEvent;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;


public class ShortcutTest {

/**

* 測試使用

* @param args

*/

public static void main(String[] args) {

JFrame frame = new JFrame();


JButton button = new JButton("Button");

JTextArea textArea = new JTextArea();

JScrollPane scroller = new JScrollPane(textArea);

frame.getContentPane().add(button, BorderLayout.NORTH);

frame.getContentPane().add(scroller, BorderLayout.CENTER);


// ////////////////////////////////////////////////////////////////////////////////////

// 注冊快捷鍵方法

ShortcutManager.getInstance().addShortcutListener(new ShortcutManager.ShortcutListener() {

public void handle() {

System.out.println("Meta + I");

}

}, KeyEvent.VK_META, KeyEvent.VK_I);


ShortcutManager.getInstance().addShortcutListener(new ShortcutManager.ShortcutListener() {

public void handle() {

System.out.println("Ctrl + Meta + M");

}

}, KeyEvent.VK_CONTROL, KeyEvent.VK_META, KeyEvent.VK_M);


// 測試忽略文本輸入里面的快捷鍵事件, 當按鈕得到焦點時, 快捷鍵事件能正常發生

ShortcutManager.getInstance().addIgnoredComponent(textArea);

// /////////////////////////////////////////////////////////////////////////////////////


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(500, 500);

frame.setVisible(true);

}

}


 


 


posted on 2010-01-31 00:02 逛奔的蝸牛 閱讀(3315) 評論(1)  編輯 收藏 引用 所屬分類: Java

評論

# re: Java;Swing程序中使用應用程序級的全局快捷鍵 2014-02-24 12:15 路人
好用,幫了大忙··膜拜了··謝謝分享  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩中文字幕在线视频| 久久超碰97人人做人人爱| 欧美日韩精品一本二本三本| 欧美激情一区二区三区蜜桃视频| 久久超碰97中文字幕| 久久久不卡网国产精品一区| 久久精品成人欧美大片古装| 久久午夜影视| 欧美激情乱人伦| 欧美日韩一区二区在线观看| 国产精品久久久久久久浪潮网站| 国产精品丝袜xxxxxxx| 国产亚洲精品久久飘花| 精久久久久久久久久久| 亚洲欧洲另类国产综合| 中文国产一区| 久久爱www.| 免费观看国产成人| 亚洲人午夜精品| 亚洲国产一成人久久精品| 一本一本久久a久久精品综合麻豆| 亚洲一本视频| 欧美不卡高清| 国产精品麻豆成人av电影艾秋| 国产麻豆综合| 一区二区三区四区五区在线 | 亚洲精品视频中文字幕| 亚洲一区二区三区免费观看| 久久精品国产久精国产爱| 欧美xart系列高清| 99re国产精品| 中国成人在线视频| 久久久久久久97| 亚洲国产精品一区二区www| 亚洲一区二区三区免费在线观看| 久久免费视频这里只有精品| 国产精品最新自拍| 久久精品国产一区二区三区| 亚洲欧美日韩综合aⅴ视频| 欧美日韩亚洲成人| 一区二区三区日韩| 欧美激情第五页| 欧美日本国产视频| 亚洲欧美日本国产有色| 在线看片一区| 亚洲视频在线视频| 久久精品国产一区二区三区免费看| 狠狠色狠狠色综合| 久久久久久久综合日本| 亚洲精品一区二区三| 午夜精品久久久久久久99水蜜桃| 欧美国产日韩a欧美在线观看| 国内成人精品2018免费看| 亚洲一区二区视频在线观看| 亚洲国产精品久久| 久久久久久久高潮| 国产一区二区福利| 久久久www成人免费精品| 亚洲在线日韩| 午夜精品在线观看| 国产日韩精品电影| 久久精品视频亚洲| 久久福利影视| 99re6热在线精品视频播放速度 | 国产精品一区二区在线| 亚洲美女电影在线| 亚洲黄色天堂| 欧美精品一区二区三区蜜臀| 亚洲黄色成人久久久| 欧美刺激午夜性久久久久久久| 欧美风情在线| 一区二区三区偷拍| 日韩亚洲国产精品| 欧美成人一品| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美午夜一区| 亚洲午夜一区二区| 亚洲综合日韩中文字幕v在线| 国产精品大片免费观看| 午夜精品久久久久久久99热浪潮 | 午夜天堂精品久久久久| 国产亚洲精品一区二区| 欧美a级片网| 牛夜精品久久久久久久99黑人| 亚洲精品乱码久久久久久久久| 亚洲黄色成人久久久| 欧美色综合网| 久久久噜噜噜久久狠狠50岁| 美女黄毛**国产精品啪啪| 日韩亚洲在线观看| 亚洲视频欧洲视频| 精品粉嫩aⅴ一区二区三区四区| 亚洲福利视频一区二区| 欧美精品在线一区二区三区| 午夜国产精品视频免费体验区| 欧美主播一区二区三区美女 久久精品人| 红桃av永久久久| 亚洲欧洲精品一区二区| 国产精品视频专区| 亚洲第一区中文99精品| 国产精品腿扒开做爽爽爽挤奶网站| 久久在线视频在线| 欧美婷婷久久| 欧美激情日韩| 国产一区二区三区久久久久久久久| 欧美 日韩 国产 一区| 国产精品福利在线观看| 欧美黄色免费| 国产在线播精品第三| 99在线精品免费视频九九视| 激情久久久久久久| 亚洲影音一区| 一区二区三区鲁丝不卡| 久久久久久国产精品mv| 午夜亚洲一区| 麻豆av一区二区三区久久| 亚洲精品在线二区| 好看不卡的中文字幕| 一区二区三区四区五区视频| 亚洲欧洲精品一区二区三区不卡 | 欧美~级网站不卡| 欧美激情a∨在线视频播放| 亚洲每日更新| 欧美三级日本三级少妇99| 欧美mv日韩mv国产网站| 国产视频观看一区| 一本大道av伊人久久综合| 亚洲电影天堂av| 欧美综合激情网| 久久国产精品久久久久久电车| 国产精品porn| 在线视频欧美日韩| 亚洲中字在线| 国产精品久久久久毛片软件 | 久久精品夜色噜噜亚洲a∨ | 欧美一区二区在线免费观看| 欧美日韩国产小视频| 亚洲国产天堂久久综合| 最新亚洲电影| 欧美成人免费小视频| 亚洲国产精品美女| 日韩亚洲欧美综合| 欧美喷潮久久久xxxxx| 欧美粗暴jizz性欧美20| 亚洲国产精品女人久久久| 久久亚洲捆绑美女| 欧美激情一区二区三区四区| 亚洲精品一区二区三区婷婷月| 美女啪啪无遮挡免费久久网站| 欧美成人午夜激情视频| 亚洲人成艺术| 欧美日韩一区在线播放| 亚洲免费在线观看| 欧美在线视频免费| 尤妮丝一区二区裸体视频| 久久久免费精品视频| 美女免费视频一区| 尤物在线精品| 欧美/亚洲一区| 日韩视频在线观看免费| 欧美一区二区三区另类| 极品少妇一区二区三区| 欧美激情a∨在线视频播放| 一本色道久久综合狠狠躁篇怎么玩| 亚洲欧美成人网| 黑人一区二区三区四区五区| 欧美成人dvd在线视频| 亚洲电影免费观看高清完整版在线观看 | 国产精品一卡二| 久久久久久久久久久久久9999| 欧美搞黄网站| 亚洲人体1000| 狂野欧美性猛交xxxx巴西| 免费成年人欧美视频| 亚洲国产精品久久| 欧美精品综合| 久久激情一区| 亚洲美女在线看| 欧美在线免费观看视频| 亚洲日本久久| 国产精品欧美一区喷水| 久久久久女教师免费一区| 日韩一级大片| 麻豆乱码国产一区二区三区| 亚洲视频在线看| 伊人狠狠色j香婷婷综合| 欧美体内she精视频| 女仆av观看一区| 久久国产精品99国产精| 99国产精品99久久久久久粉嫩| 久久人人精品| 午夜欧美大片免费观看| 亚洲日本在线视频观看| 国产一区二区三区日韩| 欧美午夜精品伦理| 欧美精品在线观看播放| 久热成人在线视频| 久久精品国产久精国产思思| 亚洲欧美另类在线观看| 99视频日韩|