码迷,mamicode.com
首页 > Windows程序 > 详细

Swing之QQ软键盘

时间:2015-06-14 16:55:54      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:swing   java   popup   qq   软键盘   

目录:

  1. 代码

  2. 效果图


完全实现QQ登录界面的软件盘功能!

代码:


直接上代码,以下代码非常完整,copy后能直接运行:

package swing.component.popup;

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Paint;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.RenderingHints.Key;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JPopupMenu;
import javax.swing.JToolTip;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;

import sun.swing.SwingUtilities2;

//软键盘弹出菜单
public class SoftKeyBoardPopup extends JPopupMenu {

	private static final long serialVersionUID = 1L;

	public static void main(String[] args) {

		final JFrame frame = new JFrame();
		frame.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(500, 500);
		frame.setLocationRelativeTo(null);

		final JPanel passwordPanel = new JPanel(new BorderLayout());
		passwordPanel.setBackground(Color.WHITE);
		passwordPanel.setPreferredSize(new Dimension(202, 30));
		passwordPanel.setLayout(new BorderLayout());
		passwordPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));

		frame.add(passwordPanel);

		final JPasswordField password = new JPasswordField();
		password.setSelectedTextColor(Color.BLACK);// 颜色障眼法,产生不能去选中密码框的任何东西的幻觉,其实已经选中了但你不知道
		password.setSelectionColor(Color.WHITE);// 颜色障眼法,产生不能去选中密码框的任何东西的幻觉,其实已经选中了但你不知道
		password.setForeground(Color.BLACK);
		password.setFont(password.getFont().deriveFont(22f));
		// password.setEchoChar(‘●‘);
		password.setBorder(new EmptyBorder(5, 3, 0, 3));// 左间隙
		passwordPanel.add(password, BorderLayout.CENTER);

		final SoftKeyBoardPopup keyPopup = new SoftKeyBoardPopup(password);
		final JLabel keyBoard = new JLabel("软件盘");
		keyBoard.setOpaque(true);
		keyBoard.setBackground(Color.WHITE);
		keyBoard.setBorder(new EmptyBorder(0, 0, 0, 0));
		keyBoard.setToolTipText("打开软键盘");
		keyBoard.setPreferredSize(new Dimension(42, 23));
		keyBoard.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

		keyBoard.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if (!keyPopup.isVisible()) {
					keyPopup.show(passwordPanel, 0, passwordPanel.getPreferredSize().height);
					keyPopup.getSoftKeyBoardPanel().reset();
					keyPopup.repaint();
				}
			}
		});
		passwordPanel.add(keyBoard, BorderLayout.EAST);

		frame.setVisible(true);
	}

	private static Color transparentColor = new Color(255, 255, 255, 0);
	// private static Dimension popupSize = new Dimension(360, 110);//QQ软键盘大小
	private static Dimension popupSize = new Dimension(365, 110);
	private static Color backColor = new Color(23, 127, 194);
	private static Random random = new Random();

	protected SoftKeyBoardPanel softKeyBoardPanel;

	public SoftKeyBoardPopup(JPasswordField passwordField) {
		softKeyBoardPanel = new SoftKeyBoardPanel(passwordField, this);
		softKeyBoardPanel.setPreferredSize(popupSize);
		softKeyBoardPanel.setBorder(BorderFactory.createEmptyBorder());

		add(softKeyBoardPanel);
		setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));// 空边框
		setOpaque(false);// 透明
	}

	public static void gc() {
		popupSize = null;
		backColor = null;
		random = null;
		System.gc();
	}

	public static void resetValue() {
		popupSize = new Dimension(380, 110);
		backColor = new Color(23, 127, 194);
		random = new Random();
	}

	public SoftKeyBoardPanel getSoftKeyBoardPanel() {
		return softKeyBoardPanel;
	}

	// 软键盘面板
	public static class SoftKeyBoardPanel extends JPanel implements ActionListener {

		JPasswordField passwordField;
		JPopupMenu popupMenu;
		RowPanel[] rows;
		KeyStatus status = KeyStatus.normal;
		Paint[] paints = new Paint[] { new Color(70, 67, 114), new Color(62, 192, 238), new Color(138, 180, 231) };

		public SoftKeyBoardPanel(JPasswordField passwordField, JPopupMenu popupMenu) {
			this.passwordField = passwordField;
			this.popupMenu = popupMenu;
			initSoftKeyBoardPanel();
		}

		// 初始化
		private void initSoftKeyBoardPanel() {
			setLayout(null);
			setBackground(backColor);

			JPanel proxyPanel = new JPanel(new GridLayout(4, 1, 0, 1));// 4行一列,0水平间隙,1垂直间隙
			proxyPanel.setBackground(backColor);
			proxyPanel.setLocation(3, 4);
			proxyPanel.setSize(popupSize.width - 6, popupSize.height - 7);
			add(proxyPanel);

			rows = new RowPanel[] { new RowPanel(RowType.first), new RowPanel(RowType.second), new RowPanel(RowType.third), new RowPanel(RowType.fourth) };
			for (int i = 0; i < rows.length; i++) {
				proxyPanel.add(rows[i]);
			}
		}

		// 重写paint绘制想要的效果
		@Override
		public void paint(Graphics g) {
			super.paint(g);
			Graphics2D g2d = (Graphics2D) g;
			ImageTool.setAntiAliasing(g2d);// 抗锯齿
			ImageTool.drawRoundRect(g2d, getWidth(), getHeight(), 0, null, paints);// 绘制软键盘成圆角和多层颜色边框
		}

		// 处理所有软键盘点击事件
		@Override
		public void actionPerformed(ActionEvent e) {
			KeyLable keyLable = (KeyLable) e.getSource();
			if (keyLable.isShift() || keyLable.isCapsLock()) {
				boolean pressed = keyLable.isPressed();

				if (keyLable.isShift()) {
					clickShift();
				} else if (keyLable.isCapsLock()) {
					clickCapsLock();
				}
				pressed = !pressed;
				keyLable.setPressed(pressed);

				notifyKeyLabel();
			} else if (keyLable.isBackSpace()) {
				clickBackSpace();
			} else if (keyLable.isCommKey()) {
				String key;
				if (status == KeyStatus.shift || status == KeyStatus.shiftAndCapsLock) {
					key = keyLable.getCenterKey();
				} else if (status == KeyStatus.normal || status == KeyStatus.capsLock) {
					key = keyLable.getLowerLeftKey() == null ? keyLable.getCenterKey() : keyLable.getLowerLeftKey();
				} else {
					key = "";
				}
				clickCommKey(key);
			}
		}

		// 通知KeyLabel更新状态
		public void notifyKeyLabel() {
			for (RowPanel rowPanel : rows) {
				for (KeyLable keyLable : rowPanel.getKeys()) {
					keyLable.setStatus(status);
				}
			}
		}

		// 重置键盘, 清除按压状态,并将键盘恢复至初始状态
		public void reset() {
			for (RowPanel rowPanel : rows) {
				for (KeyLable keyLable : rowPanel.getKeys()) {
					keyLable.reset();
				}
			}
			status = KeyStatus.normal;
		}

		// 更改状态
		public void clickShift() {
			if (status == KeyStatus.capsLock) {
				status = KeyStatus.shiftAndCapsLock;
			} else if (status == KeyStatus.shiftAndCapsLock) {
				status = KeyStatus.capsLock;
			} else if (status == KeyStatus.shift) {
				status = KeyStatus.normal;
			} else if (status == KeyStatus.normal) {
				status = KeyStatus.shift;
			} else {
				status = KeyStatus.normal;
			}
		}

		// 更改状态
		public void clickCapsLock() {
			if (status == KeyStatus.capsLock) {
				status = KeyStatus.normal;
			} else if (status == KeyStatus.shiftAndCapsLock) {
				status = KeyStatus.shift;
			} else if (status == KeyStatus.shift) {
				status = KeyStatus.shiftAndCapsLock;
			} else if (status == KeyStatus.normal) {
				status = KeyStatus.capsLock;
			} else {
				status = KeyStatus.normal;
			}
		}

		// 点击了删除键, 删除一个字符
		public void clickBackSpace() {
			char[] password = passwordField.getPassword();
			if (password != null && password.length > 0) {
				char[] copyOf = Arrays.copyOf(password, password.length - 1);
				passwordField.setText(new String(copyOf));
				System.out.println("已删除的字符:" + password[password.length - 1]);
				System.out.println("删除后的的密码:" + new String(copyOf));
			}
		}

		// 点击了普通的键,添加一个字符
		public void clickCommKey(String key) {
			if (key != null) {
				if (key.length() > 1) {// 可有可无的检查
					key = key.substring(0, key.length() - 1);
				}
				char[] password = passwordField.getPassword();
				String string = (password == null ? "" : new String(password));
				passwordField.setText(string + key);
				System.out.println("新添加的字符:" + key);
				System.out.println("添加后的密码:" + string + key);
			}
		}

		public RowPanel[] getRows() {
			return rows;
		}

		// 创建关闭图标
		public Image createCloseImage(Color fontColor, boolean isFocus) {
			int width = 12;
			BufferedImage bi = new BufferedImage(width, width, BufferedImage.TYPE_4BYTE_ABGR);
			Graphics2D g2d = bi.createGraphics();

			ImageTool.setAntiAliasing(g2d);

			// 画背景
			g2d.setPaint(transparentColor);
			g2d.fillRect(0, 0, width, width);

			int[] xpoints_1 = { 2, 4, 8, 10 };
			int[] ypoints_1 = { 2, 2, 10, 10 };
			int npoints_1 = 4;
			Polygon p_left = new Polygon(xpoints_1, ypoints_1, npoints_1);// 左上角到右下角图标

			int[] xpoints_2 = xpoints_1;
			int[] ypoints_2 = { 10, 10, 2, 2 };
			int npoints_2 = 4;
			Polygon p_right = new Polygon(xpoints_2, ypoints_2, npoints_2);// 右上角到左下角图标

			if (isFocus) {
				g2d.setPaint(new GradientPaint(0, 0, fontColor, 0, width, new Color(fontColor.getRed(), fontColor.getGreen(), fontColor.getBlue(), 50)));
			} else {
				g2d.setPaint(fontColor);
			}
			// 画关闭图标("x")
			g2d.fillPolygon(p_left);
			g2d.fillPolygon(p_right);

			return bi;
		}

		public class RowPanel extends JPanel {
			RowType rowType;
			KeyLable[] keys;

			public RowPanel(RowType rowType) {
				this.rowType = rowType;
				initRowPanel();
			}

			private void initRowPanel() {
				setOpaque(true);
				setLayout(new FlowLayout(FlowLayout.CENTER, 1, 0));// 水平间隙1,垂直间隙0
				setBackground(backColor);
				if (rowType == RowType.first) {

					KeyLable key1 = new KeyLable("!", "1", SoftKeyBoardPanel.this);
					KeyLable key2 = new KeyLable("@", "2", SoftKeyBoardPanel.this);
					KeyLable key3 = new KeyLable("#", "3", SoftKeyBoardPanel.this);
					KeyLable key4 = new KeyLable("$", "4", SoftKeyBoardPanel.this);
					KeyLable key5 = new KeyLable("%", "5", SoftKeyBoardPanel.this);
					KeyLable key6 = new KeyLable("^", "6", SoftKeyBoardPanel.this);
					KeyLable key7 = new KeyLable("&", "7", SoftKeyBoardPanel.this);
					KeyLable key8 = new KeyLable("*", "8", SoftKeyBoardPanel.this);
					KeyLable key9 = new KeyLable("(", "9", SoftKeyBoardPanel.this);
					KeyLable key10 = new KeyLable(")", "0", SoftKeyBoardPanel.this);
					KeyLable key11 = new KeyLable("~", "`", SoftKeyBoardPanel.this);// 这个键的位置随机
					KeyLable key12 = new KeyLable("BackSpace", true, SoftKeyBoardPanel.this);// 功能键,位置固定在最右
					key12.setPreferredSize(new Dimension(70, 25));

					keys = new KeyLable[] { key4, key5, key6, key7, key8, key9, key10, key11, key1, key2, key3, key12 };
					ArrayList<KeyLable> keylist = new ArrayList<KeyLable>(keys.length);

					for (KeyLable key : keys) {
						if (key != key11) {// key11排除在外
							keylist.add(key);
						}
					}

					int randomIndex = random.nextInt(keys.length - 1);// 排除最后一个留给key12的位置
					keylist.add(randomIndex, key11);

					for (KeyLable key : keylist) {
						this.add(key);
					}

					// 关闭Label
					final Image defaImage = createCloseImage(new Color(138, 180, 231), false);
					final Image focusImage = createCloseImage(new Color(30, 90, 150), true);
					final JLabel closeLabel = new JLabel(new ImageIcon(defaImage)) {
						JToolTip toolTip;

						protected void paintComponent(Graphics g) {
							super.paintComponent(g);
							ImageIcon icon = (ImageIcon) getIcon();
							if (icon != null) {
								g.drawImage(icon.getImage(), 0, 0, 12, 12, 0, 0, 12, 12, null);
							}
						}

						public JToolTip createToolTip() {
							JToolTip toolTip = new JToolTip();
							Color color = new Color(118, 118, 118);

							toolTip.setComponent(this);
							toolTip.setTipText(this.getToolTipText());
							toolTip.setBackground(Color.WHITE);
							toolTip.setForeground(color);
							toolTip.setFont(new Font(Font.DIALOG, Font.PLAIN, 12));

							Border outside = BorderFactory.createLineBorder(color);
							Border inside = BorderFactory.createEmptyBorder(2, 3, 2, 3);
							CompoundBorder border = BorderFactory.createCompoundBorder(outside, inside);
							toolTip.setBorder(border);
							return toolTip;
						}
					};
					MouseAdapter mouseAdapter = new MouseAdapter() {
						public void mouseClicked(MouseEvent e) {
							popupMenu.setVisible(false);
						}

						public void mouseEntered(MouseEvent e) {
							closeLabel.setIcon(new ImageIcon(focusImage));
						}

						public void mouseExited(MouseEvent e) {
							closeLabel.setIcon(new ImageIcon(defaImage));
						}
					};
					closeLabel.setToolTipText("关闭");
					closeLabel.addMouseListener(mouseAdapter);
					closeLabel.setPreferredSize(new Dimension(12, 12));
					add(closeLabel);
				} else if (rowType == RowType.second) {
					// key1至key10是一个闭环顺序,通过随机数决定在哪个位置切断这个环从而使其变成单链
					KeyLable key1 = new KeyLable("+", "=", SoftKeyBoardPanel.this);
					KeyLable key2 = new KeyLable("|", "\\", SoftKeyBoardPanel.this);
					KeyLable key3 = new KeyLable("{", "[", SoftKeyBoardPanel.this);
					KeyLable key4 = new KeyLable("}", "]", SoftKeyBoardPanel.this);
					KeyLable key5 = new KeyLable(":", ";", SoftKeyBoardPanel.this);
					KeyLable key6 = new KeyLable("\"", "‘", SoftKeyBoardPanel.this);
					KeyLable key7 = new KeyLable("<", ",", SoftKeyBoardPanel.this);
					KeyLable key8 = new KeyLable(">", ".", SoftKeyBoardPanel.this);
					KeyLable key9 = new KeyLable("?", "/", SoftKeyBoardPanel.this);
					KeyLable key10 = new KeyLable("_", "-", SoftKeyBoardPanel.this);
					KeyLable key11 = new KeyLable("Shift", true, SoftKeyBoardPanel.this);// 功能键,位置固定在最左
					key11.setPreferredSize(new Dimension(35, 25));
					KeyLable key12 = new KeyLable("CapsLock", true, SoftKeyBoardPanel.this);// 功能键,位置固定在最右
					key12.setPreferredSize(new Dimension(65, 25));

					keys = new KeyLable[] { key11, key2, key3, key4, key5, key6, key7, key8, key9, key10, key1, key12 };
					ArrayList<KeyLable> keylist = new ArrayList<KeyLable>(keys.length);
					int randomIndex = random.nextInt(keys.length - 2) + 1;// 随机切入点,排除key11和key12的位置

					keylist.add(key11);
					for (int i = randomIndex; i < keys.length - 1; i++) {
						keylist.add(keys[i]);
					}
					for (int i = 1; i < randomIndex; i++) {
						keylist.add(keys[i]);
					}
					keylist.add(key12);

					for (KeyLable key : keylist) {
						this.add(key);
					}
				} else if (rowType == RowType.third) {
					// key1至key13是一个闭环顺序,通过随机数决定在哪个位置切断这个环从而使其变成单链
					KeyLable key1 = new KeyLable("c", SoftKeyBoardPanel.this);
					KeyLable key2 = new KeyLable("d", SoftKeyBoardPanel.this);
					KeyLable key3 = new KeyLable("e", SoftKeyBoardPanel.this);
					KeyLable key4 = new KeyLable("f", SoftKeyBoardPanel.this);
					KeyLable key5 = new KeyLable("g", SoftKeyBoardPanel.this);
					KeyLable key6 = new KeyLable("h", SoftKeyBoardPanel.this);
					KeyLable key7 = new KeyLable("i", SoftKeyBoardPanel.this);
					KeyLable key8 = new KeyLable("j", SoftKeyBoardPanel.this);
					KeyLable key9 = new KeyLable("k", SoftKeyBoardPanel.this);
					KeyLable key10 = new KeyLable("l", SoftKeyBoardPanel.this);
					KeyLable key11 = new KeyLable("m", SoftKeyBoardPanel.this);
					KeyLable key12 = new KeyLable("a", SoftKeyBoardPanel.this);
					KeyLable key13 = new KeyLable("b", SoftKeyBoardPanel.this);

					keys = new KeyLable[] { key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13 };
					ArrayList<KeyLable> keylist = new ArrayList<KeyLable>(keys.length);
					int randomIndex = random.nextInt(keys.length);// 随机切入点

					for (int i = randomIndex; i < keys.length; i++) {
						keylist.add(keys[i]);
					}
					for (int i = 0; i < randomIndex; i++) {
						keylist.add(keys[i]);
					}

					for (KeyLable key : keylist) {
						this.add(key);
					}
				} else if (rowType == RowType.fourth) {
					// key1至key13是一个闭环顺序,通过随机数决定在哪个位置切断这个环从而使其变成单链
					KeyLable key1 = new KeyLable("n", SoftKeyBoardPanel.this);
					KeyLable key2 = new KeyLable("o", SoftKeyBoardPanel.this);
					KeyLable key3 = new KeyLable("p", SoftKeyBoardPanel.this);
					KeyLable key4 = new KeyLable("q", SoftKeyBoardPanel.this);
					KeyLable key5 = new KeyLable("r", SoftKeyBoardPanel.this);
					KeyLable key6 = new KeyLable("s", SoftKeyBoardPanel.this);
					KeyLable key7 = new KeyLable("t", SoftKeyBoardPanel.this);
					KeyLable key8 = new KeyLable("u", SoftKeyBoardPanel.this);
					KeyLable key9 = new KeyLable("v", SoftKeyBoardPanel.this);
					KeyLable key10 = new KeyLable("w", SoftKeyBoardPanel.this);
					KeyLable key11 = new KeyLable("x", SoftKeyBoardPanel.this);
					KeyLable key12 = new KeyLable("y", SoftKeyBoardPanel.this);
					KeyLable key13 = new KeyLable("z", SoftKeyBoardPanel.this);

					keys = new KeyLable[] { key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13 };
					ArrayList<KeyLable> keylist = new ArrayList<KeyLable>(keys.length);
					int randomIndex = random.nextInt(keys.length);// 随机切入点

					for (int i = randomIndex; i < keys.length; i++) {
						keylist.add(keys[i]);
					}
					for (int i = 0; i < randomIndex; i++) {
						keylist.add(keys[i]);
					}

					for (KeyLable key : keylist) {
						this.add(key);
					}
				}
			}

			public KeyLable[] getKeys() {
				return keys;
			}
		}
	}

	// 键标签
	public static class KeyLable extends JLabel {

		// 用String而不是char考虑有功能键显示的是文字,不想再多一个字段了
		String centerKey;
		String lowerLeftKey;
		boolean isBackSpace;
		boolean isCapsLock;
		boolean isShift;
		boolean isPressed;
		KeyStatus status = KeyStatus.normal;
		Dimension size = new Dimension(24, 24);
		Color keyBorderColor = new Color(54, 112, 184);
		Color keyBorderFocusColor = new Color(64, 194, 241);
		Color keyBackColor = new Color(253, 255, 255);
		Color keyBackFocusColor = new Color(28, 159, 228);
		Font boldFont = new Font("微软雅黑", Font.PLAIN, 12);
		Color boldColor = new Color(0, 0, 57);
		Font plainFont = new Font("微软雅黑", Font.PLAIN, 10);
		Color plainColor = new Color(156, 157, 197);

		public KeyLable(String centerKey, ActionListener action) {
			this(centerKey, null, action);
		}

		public KeyLable(String centerKey, String lowerLeftKey, ActionListener action) {
			this(centerKey, lowerLeftKey, false, action);
		}

		public KeyLable(String centerKey, boolean isFunctionKey, ActionListener action) {
			this(centerKey, null, isFunctionKey, action);
		}

		public KeyLable(String centerKey, String lowerLeftKey, boolean isFunctionKey, final ActionListener action) {
			this.centerKey = centerKey;
			this.lowerLeftKey = lowerLeftKey;
			if (isFunctionKey) {// 这个变量主要是提高效率
				if (centerKey.indexOf("Shift") >= 0) {
					isShift = true;
				} else if (centerKey.indexOf("Back") >= 0 || centerKey.indexOf("Space") >= 0) {
					isBackSpace = true;
				} else if (centerKey.indexOf("Caps") >= 0 || centerKey.indexOf("Lock") >= 0) {
					isCapsLock = true;
				}
			}

			setOpaque(true);// 不透明
			setBackground(keyBackColor);
			setPreferredSize(size);
			setBorder(BorderFactory.createLineBorder(keyBorderColor));
			setFont(boldFont);

			addMouseListener(new MouseAdapter() {
				public void mouseEntered(MouseEvent e) {
					KeyLable.this.setBackground(keyBackFocusColor);// 鼠标悬浮时的背景色
				}

				public void mouseExited(MouseEvent e) {
					// 如果不是Shift和CapsLock键则还原背景色,或者是Shift和CapsLock键但是不是按压状态也要还原背景色
					if ((!KeyLable.this.isShift && !KeyLable.this.isCapsLock) || (!isPressed)) {
						KeyLable.this.setBackground(keyBackColor);
					}
				}

				public void mouseClicked(MouseEvent e) {
					// 创建一个ActionEvent将KeyLable对象作为Source
					action.actionPerformed(new ActionEvent(KeyLable.this, ActionEvent.ACTION_PERFORMED, e.getID() + ""));
				}
			});
		}

		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);// 完成背景色的绘制

			Graphics2D g2d = (Graphics2D) g;
			ImageTool.setAntiAliasing(g2d);// 抗锯齿
			Container parent = getParent();
			ImageTool.clearAngle(g2d, parent != null ? parent.getBackground() : this.getBackground(), this.getWidth(), this.getHeight(), 4);// 清除角落变圆角

			if (getMousePosition() != null) {// 如果鼠标正在这个键的范围内,绘制圆角边框
				g2d.setPaint(keyBorderFocusColor);
				g2d.drawRoundRect(1, 1, getWidth() - 3, getHeight() - 3, 4, 4);
			}

			if (status == KeyStatus.normal || status == KeyStatus.capsLock) {
				if (lowerLeftKey == null) {
					g2d.setFont(boldFont);
					g2d.setPaint(boldColor);
					// g2d.drawString(centerKey, isCommKey() ? 8 : 4, 17);
					SwingUtilities2.drawStringUnderlineCharAt(this, g2d, centerKey, -1, isCommKey() ? 8 : 4, 17);

				} else {
					g2d.setFont(plainFont);
					g2d.setPaint(plainColor);
					// g2d.drawString(centerKey, 12, 15);
					SwingUtilities2.drawStringUnderlineCharAt(this, g2d, centerKey, -1, 12, 15);

					g2d.setFont(boldFont);
					g2d.setPaint(boldColor);
					// g2d.drawString(lowerLeftKey, 3, 20);
					SwingUtilities2.drawStringUnderlineCharAt(this, g2d, lowerLeftKey, -1, 3, 20);
				}
			} else if (status == KeyStatus.shift || status == KeyStatus.shiftAndCapsLock) {
				if (lowerLeftKey == null) {
					g2d.setFont(boldFont);
					g2d.setPaint(boldColor);
					// g2d.drawString(centerKey, isCommKey() ? 8 : 4, 17);
					SwingUtilities2.drawStringUnderlineCharAt(this, g2d, centerKey, -1, isCommKey() ? 8 : 4, 17);

				} else {
					g2d.setFont(boldFont);
					g2d.setPaint(boldColor);
					// g2d.drawString(centerKey, 10, 15);
					SwingUtilities2.drawStringUnderlineCharAt(this, g2d, centerKey, -1, 10, 15);

					g2d.setFont(plainFont);
					g2d.setPaint(plainColor);
					// g2d.drawString(lowerLeftKey, 3, 20);
					SwingUtilities2.drawStringUnderlineCharAt(this, g2d, lowerLeftKey, -1, 3, 20);
				}
			}
		}

		public String getCenterKey() {
			return centerKey;
		}

		public String getLowerLeftKey() {
			return lowerLeftKey;
		}

		public boolean isBackSpace() {
			return isBackSpace;
		}

		public boolean isCapsLock() {
			return isCapsLock;
		}

		public boolean isShift() {
			return isShift;
		}

		public void setPressed(boolean isPressed) {
			this.isPressed = isPressed;
		}

		public boolean isPressed() {
			return isPressed;
		}

		public boolean isCommKey() {
			return !isBackSpace && !isCapsLock && !isShift;
		}

		// 重置
		public void reset() {
			this.isPressed = false;
			if (isShift || isCapsLock) {
				KeyLable.this.setBackground(keyBackColor);
			} else if (isCommKey()) {
				if (lowerLeftKey == null) {
					centerKey = centerKey.toLowerCase();
				}
			}
			status = KeyStatus.normal;
			repaint();
		}

		// 设置状态
		public void setStatus(KeyStatus status) {
			if (isCommKey() && this.status != status) {
				if (status == KeyStatus.shift || status == KeyStatus.capsLock) {
					if (lowerLeftKey == null) {
						if (Character.isUpperCase(centerKey.charAt(0))) {
							centerKey = centerKey.toLowerCase();
						} else {
							centerKey = centerKey.toUpperCase();
						}
					}
				} else if (status == KeyStatus.normal || status == KeyStatus.shiftAndCapsLock) {
					if (lowerLeftKey == null) {
						centerKey = centerKey.toLowerCase();
					}
				}
				this.status = status;
				repaint();
			}
		}
	}

	public static enum RowType {
		first, second, third, fourth
	}

	public static enum KeyStatus {
		normal, shift, capsLock, shiftAndCapsLock
	}
}

class ImageTool {

	// 设置Graphics2D抗锯齿,具体请查看RenderingHints类的API
	public static void setAntiAliasing(Graphics2D g2d) {
		setRenderingHint(g2d, RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
	}

	public static void setRenderingHint(Graphics2D g2d, Key key, Object value) {
		if (g2d.getRenderingHints() == null) {
			g2d.setRenderingHints(new RenderingHints(key, value));
		} else {
			g2d.setRenderingHint(key, value);
		}
	}

	// 绘制圆角
	public static void drawRoundRect(Graphics2D g2d, int width, int height, int r, Paint anglePaint, Paint[] borderPaints) {
		clearAngle(g2d, anglePaint, width, height, r);// 清除角落
		drawMultiBorder(g2d, width, height, r, anglePaint, borderPaints);// 画边框
	}

	// 清除角落
	public static void clearAngle(Graphics2D g2d, Paint anglePaint, int width, int height, int r) {
		setAntiAliasing(g2d);
		Composite oldComposite = g2d.getComposite();

		if (anglePaint == null) {
			g2d.setComposite(AlphaComposite.Clear);// 设置Composite为清空
		} else {
			g2d.setPaint(anglePaint);
		}

		int npoints = 5;// 5点定位一个角落轨迹
		// 左上角
		int[] xpoints1 = { r, 0, 0, r / 4, r / 2 };
		int[] ypoints1 = { 0, 0, r, r / 2, r / 4 };
		Polygon polygon = new Polygon(xpoints1, ypoints1, npoints);
		g2d.fillPolygon(polygon);
		// 右上角
		int[] xpoints2 = { width - r, width, width, width - r / 4, width - (r / 2) };
		int[] ypoints2 = ypoints1;
		polygon = new Polygon(xpoints2, ypoints2, npoints);
		g2d.fillPolygon(polygon);
		// 右下角
		int[] xpoints3 = xpoints2;
		int[] ypoints3 = { height, height, height - r, height - (r / 2), height - r / 4 };
		polygon = new Polygon(xpoints3, ypoints3, npoints);
		g2d.fillPolygon(polygon);
		// 左下角
		int[] xpoints4 = xpoints1;
		int[] ypoints4 = ypoints3;
		polygon = new Polygon(xpoints4, ypoints4, npoints);
		g2d.fillPolygon(polygon);
		// 还原Composite
		g2d.setComposite(oldComposite);
	}

	// 绘制有层次感的边框
	public static void drawMultiBorder(Graphics2D g2d, int width, int height, int r, Paint anglePaint, Paint[] borderPaints) {
		setAntiAliasing(g2d);

		int roundx = r * 2;
		int roundy = roundx;
		int grow = 2;
		int x = 0;
		int y = 0;
		int w = width;
		int h = height;

		// 从外层往内层开始画
		for (int i = 0; i < borderPaints.length; i++, x++, y++, w -= grow, h -= grow) {
			g2d.setPaint(borderPaints[i]);
			if (r > 0) {
				g2d.drawRoundRect(x, y, w - 1, h - 1, roundx, roundy);
			} else {
				g2d.drawRect(x, y, w - 1, h - 1);
			}
		}
	}
}

运行效果:


技术分享

本文出自 “思想永无止境” 博客,请务必保留此出处http://tangzhichao.blog.51cto.com/8132978/1661758

Swing之QQ软键盘

标签:swing   java   popup   qq   软键盘   

原文地址:http://tangzhichao.blog.51cto.com/8132978/1661758

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!