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

逛奔的蝸牛

我不聰明,但我會很努力

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

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>
            欧美视频网址| 免费久久99精品国产| 亚洲国产精品一区制服丝袜| 猫咪成人在线观看| 99精品久久久| 欧美影院久久久| 日韩视频在线观看国产| 亚洲砖区区免费| 亚洲韩日在线| 午夜精品av| 一区二区免费在线播放| 久久久久国内| 午夜精品久久久| 欧美国产日本| 久久久精品国产一区二区三区| 老司机精品视频一区二区三区| 欧美日韩国产一级片| 久久久久久国产精品一区| 欧美另类久久久品| 美女久久一区| 国产性天天综合网| 亚洲免费黄色| 亚洲国产一区在线| 久久国产精品99精品国产| 亚洲自啪免费| 欧美理论片在线观看| 美女精品网站| 国产一区久久| 亚洲免费一区二区| 亚洲图片在区色| 欧美电影美腿模特1979在线看| 久久久久网站| 国产欧美一区二区色老头| 亚洲老板91色精品久久| 亚洲激情在线观看视频免费| 欧美在线一区二区| 午夜免费在线观看精品视频| 欧美日韩国产色视频| 欧美激情日韩| 91久久在线播放| 牛牛精品成人免费视频| 麻豆精品网站| 一区在线播放| 久久久另类综合| 久久免费视频网站| 国内精品**久久毛片app| 午夜一区在线| 久久亚洲电影| 精品动漫一区| 久久久久国产精品厨房| 欧美1区3d| 亚洲电影免费| 免费成人黄色| 亚洲国产天堂久久综合网| 亚洲精品国产无天堂网2021| 欧美成人黄色小视频| 亚洲激情亚洲| 亚洲手机视频| 国产精品一级二级三级| 亚洲自拍啪啪| 久久久免费av| 在线精品高清中文字幕| 噜噜噜躁狠狠躁狠狠精品视频| 免费视频一区| 日韩午夜免费视频| 欧美四级剧情无删版影片| 亚洲一区在线看| 久久久亚洲人| 亚洲日本视频| 欧美午夜精品久久久| 亚洲香蕉网站| 久久久久久久97| 亚洲第一黄色网| 欧美激情a∨在线视频播放| 一本色道88久久加勒比精品| 欧美在线日韩精品| 在线日韩一区二区| 欧美日韩成人网| 午夜在线播放视频欧美| 欧美大尺度在线| 亚洲一卡久久| 伊人成人在线| 欧美偷拍另类| 久久福利精品| 亚洲美女色禁图| 夜夜嗨av色综合久久久综合网| 国产精品一区二区久激情瑜伽| 欧美一区二区三区免费视| 免费观看一区| 亚洲影院污污.| 激情综合色综合久久综合| 欧美极品aⅴ影院| 性色av一区二区怡红| 欧美国产日韩视频| 亚洲欧美在线另类| 亚洲国产精品欧美一二99| 国产精品jizz在线观看美国 | 国产精品久久999| 久久精品国产久精国产一老狼 | 狠狠色丁香婷婷综合久久片| 欧美a级片网站| 亚洲综合首页| 亚洲国产女人aaa毛片在线| 性欧美暴力猛交69hd| 91久久线看在观草草青青| 国产欧美一区二区精品仙草咪| 欧美成人午夜视频| 欧美一区二区三区免费视频| 99www免费人成精品| 欧美激情一区三区| 久久久久久久999| 亚洲一区二区三区免费观看| 亚洲夫妻自拍| 国产伊人精品| 国产精品永久免费在线| 欧美精品免费在线观看| 久久三级视频| 欧美亚洲一区三区| 亚洲神马久久| 亚洲美女中文字幕| 亚洲国产精品一区二区www在线| 久久天天躁夜夜躁狠狠躁2022 | 欧美日韩精品伦理作品在线免费观看 | 欧美色欧美亚洲另类二区| 久久只精品国产| 欧美伊人久久久久久久久影院| 一区二区三区波多野结衣在线观看| 麻豆av一区二区三区| 久久久99精品免费观看不卡| 欧美一激情一区二区三区| 亚洲一区二区三区在线| 在线亚洲精品| 一区二区三区精品| 日韩视频精品| 亚洲最新视频在线播放| 亚洲久久一区二区| 亚洲另类一区二区| 日韩亚洲在线| 中文亚洲欧美| 亚洲天堂网站在线观看视频| 亚洲午夜激情| 亚洲欧美综合国产精品一区| 亚洲一区美女视频在线观看免费| 亚洲一区www| 西西人体一区二区| 欧美在线播放| 久久久久久久久伊人| 久久夜色精品一区| 久久亚洲欧美国产精品乐播| 美女爽到呻吟久久久久| 欧美 日韩 国产一区二区在线视频 | 欧美成人资源网| 亚洲高清在线播放| 亚洲欧洲另类| 一区二区三区欧美成人| 亚洲一区二区三区四区视频| 亚洲欧美高清| 久久久亚洲成人| 欧美成人嫩草网站| 国产精品播放| 国内精品免费午夜毛片| 亚洲国产精品嫩草影院| 一区二区三区国产精华| 午夜精品婷婷| 久久久久久久久久久久久女国产乱| 久久综合狠狠综合久久综合88| 欧美激情精品久久久六区热门 | 在线亚洲一区| 欧美一区二区在线看| 毛片精品免费在线观看| 亚洲黄一区二区三区| 亚洲丝袜av一区| 久久久噜噜噜久久狠狠50岁| 欧美国产精品一区| 国产视频丨精品|在线观看| 亚洲第一偷拍| 在线综合视频| 久久亚洲美女| 99视频精品| 久久久久久国产精品mv| 欧美日韩亚洲国产精品| 伊人久久成人| 亚洲欧美国产制服动漫| 美女脱光内衣内裤视频久久网站| 亚洲精品国精品久久99热| 午夜宅男欧美| 欧美激情自拍| 极品尤物av久久免费看 | 欧美理论电影在线观看| 国产欧美日韩91| 99成人在线| 久久精品一区二区| 99在线观看免费视频精品观看| 久久久久久久综合狠狠综合| 国产精品白丝jk黑袜喷水| 亚洲欧洲一区二区三区久久| 欧美在线亚洲一区| 一区二区毛片| 欧美福利小视频| 亚洲国产精品99久久久久久久久|