现在的位置: 首页 > 综合 > 正文

直接按键设置组件的快捷方式

2018年01月30日 ⁄ 综合 ⁄ 共 2736字 ⁄ 字号 评论关闭

http://blog.csdn.net/wqjsir/article/details/6151384

 

     在很多界面设计中要求给组件设置热键,而这些热键可以由用户修改。用户在修改时只需按键就可以直接操作,这样很方便。

这里主要就是将如何从键盘的输入中获取正确的快捷键设置。

下面直接插入代码:

/**
 *All rights reserved,2010,mengke
 */
package com.mengke.j2se.util.test;

import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 *@author mengke
 *@email wqjsir@foxmail.com
 *@version 2011-1-18下午10:51:31
 */
public class KeyListenerTest implements KeyListener {
	private boolean setted;
	private int keyCode;
	final JTextField textField = new JTextField();

	public static void main(String[] args) {
		System.out.println(9 & 6);
		KeyListenerTest test = new KeyListenerTest();
		test.showUI();
	}

	public void showUI() {
		JFrame frame = new JFrame();
		JPanel panel = new JPanel();
		textField.setEditable(false);
		textField.setPreferredSize(new Dimension(160, 30));
		textField.addKeyListener(this);
		panel.add(textField);
		frame.setContentPane(panel);
		frame.setSize(new Dimension(200, 300));
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	@Override
	public void keyPressed(KeyEvent e) {
		String key = "";
		int keyCode = e.getKeyCode();
		if (e.isAltDown()) {
			key += "Alt + ";
		}
		if (e.isControlDown()) {
			key += "Ctrl + ";
		}

		if (e.isShiftDown()) {
			key += "Shift + ";
		}

		String keyChar = getKeyChar(e.getKeyCode());
		if (keyChar != null) {
			key += keyChar;
		}
		this.keyCode = keyCode;
		textField.setText(key);
		textField.updateUI();
		if (keyChar != null && keyCode != KeyEvent.VK_SHIFT && keyCode != KeyEvent.VK_ALT
				&& keyCode != KeyEvent.VK_CONTROL) {
			setted = true;
		} else {
			setted = false;
		}
		System.out.println("press:" + key);
	}

	@Override
	public void keyReleased(KeyEvent e) {
		if (setted == true) {
			return;
		}
		String key = "";
		int keyCode = e.getKeyCode();
		if (keyCode != KeyEvent.VK_ALT && keyCode != KeyEvent.VK_CONTROL && keyCode != KeyEvent.VK_SHIFT) {
			System.out.println("wu");
			textField.setText("无");
			textField.updateUI();
			return;
		}
		if (!e.isAltDown() && !e.isShiftDown() && !e.isControlDown()) {
			System.out.println("wu");
			textField.setText("无");
			textField.updateUI();
			return;
		}

		if (e.isAltDown()) {
			key += "Alt + ";
		}
		if (e.isControlDown()) {
			key += "Ctrl + ";
		}

		if (e.isShiftDown()) {
			key += "Shift + ";
		}
		key += KeyEvent.getKeyText(this.keyCode);
		textField.setText(key);
		textField.updateUI();
		
		System.err.println("release:" + key);
	}

	@Override
	public void keyTyped(KeyEvent e) {

	}

	/**
	 * 这里可以设定哪些按键是需要获取的
	 * 
	 * @param keyCode
	 * @return
	 */
	public String getKeyChar(int keyCode) {
		if (KeyEvent.VK_0 <= keyCode && KeyEvent.VK_9 >= keyCode || KeyEvent.VK_NUMPAD0 <= keyCode
				&& KeyEvent.VK_NUMPAD9 >= keyCode || KeyEvent.VK_A <= keyCode && KeyEvent.VK_Z >= keyCode
				|| KeyEvent.VK_F1 <= keyCode && KeyEvent.VK_F24 >= keyCode) {
			return KeyEvent.getKeyText(keyCode);
		}
		return null;
	}
}

 该代码演示了获取用户设置快捷键的方式。比如在用户按下Ctrl键时,JTextField中将显示Ctrl + ,表示热键还没有设置完成,如图:

如果此时用户松开按键,则显示 无,表示用户每有设置热键,如果用户 在按下Ctrl 键的同时,按下了其他键,比如A键,则显示为 Ctrl + A ,如图:

此时已经是一个完整的热键了,此时松开按键,JTextField的文本内容将不变,表示用户希望设置Ctrl + A 来设置快捷键。其他按键功能类似。

抱歉!评论已关闭.