• <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>

            逛奔的蝸牛

            我不聰明,但我會(huì)很努力

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

            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 {

            // 使用單態(tài)模式

            private static ShortcutManager instance = new ShortcutManager();


            // 快捷鍵與事件處理對(duì)象鍵值對(duì)

            private Map<String, ShortcutListener> listeners;


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

            private Set<Component> ignoredComponents;


            // 保存鍵盤上鍵與它的ascii碼對(duì)應(yīng)

            // 如果以某鍵的ascii碼為下標(biāo), 數(shù)組中此下標(biāo)的值為true, 說明此鍵被按下了.

            // 當(dāng)此鍵被釋放開后, 數(shù)組中對(duì)應(yīng)的值修改為false

            private boolean[] keys;


            private ShortcutManager() {

            keys = new boolean[256];

            ignoredComponents = new HashSet<Component>();

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


            // 只關(guān)心鍵盤事件

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

            }


            /**

            * 有鍵盤事件發(fā)生

            */

            public void eventDispatched(AWTEvent event) {

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

            KeyEvent ke = (KeyEvent) event;


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

            keys[ke.getKeyCode()] = true;


            // 查找快捷鍵對(duì)應(yīng)的處理對(duì)象, 然后調(diào)用事件處理函數(shù)

            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() {

            // 每個(gè)鍵之間用一個(gè)"."來隔開.

            // 例如ctr + x的對(duì)應(yīng)值為"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) {

            // 快捷鍵的對(duì)應(yīng)值按它們的鍵順序大小來進(jìn)行創(chuàng)建

            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 {

            /**

            * 測(cè)試使用

            * @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);


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

            // 注冊(cè)快捷鍵方法

            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);


            // 測(cè)試忽略文本輸入里面的快捷鍵事件, 當(dāng)按鈕得到焦點(diǎn)時(shí), 快捷鍵事件能正常發(fā)生

            ShortcutManager.getInstance().addIgnoredComponent(textArea);

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


            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            frame.setSize(500, 500);

            frame.setVisible(true);

            }

            }


             


             


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

            評(píng)論

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

            97久久国产亚洲精品超碰热| 欧美日韩精品久久久久| 亚洲乱码精品久久久久..| 国产综合精品久久亚洲| 亚洲国产精品人久久| 日韩人妻无码精品久久免费一 | 亚洲日本va午夜中文字幕久久| 久久中文娱乐网| 国产A级毛片久久久精品毛片| 久久99久久99小草精品免视看| 韩国无遮挡三级久久| 91精品日韩人妻无码久久不卡 | 久久久久亚洲AV无码专区桃色 | 无码人妻少妇久久中文字幕| 久久久久亚洲精品中文字幕| 亚洲国产精品成人久久蜜臀| 久久人人爽人人人人片av| 久久久久久精品无码人妻| 亚洲精品乱码久久久久久自慰| 人妻无码久久一区二区三区免费| 色偷偷88888欧美精品久久久| 国产亚洲综合久久系列| 狠狠人妻久久久久久综合蜜桃 | 成人国内精品久久久久影院VR| 久久天天躁狠狠躁夜夜不卡 | 久久99精品久久久久久hb无码| 久久青青草原综合伊人| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久婷婷国产综合精品| 青青草国产精品久久久久| 色婷婷噜噜久久国产精品12p| 中文无码久久精品| 久久91这里精品国产2020| 久久精品无码一区二区WWW| 久久久久久久尹人综合网亚洲| 久久亚洲高清综合| 成人综合伊人五月婷久久| 午夜福利91久久福利| 97久久超碰国产精品旧版| 久久人妻AV中文字幕| 久久综合久久久|