/************************************************************************** * Copyright (c) 2001, 2002, 2003 by Acunia N.V. All rights reserved. * * * * This software is copyrighted by and is the sole property of Acunia N.V. * * and its licensors, if any. All rights, title, ownership, or other * * interests in the software remain the property of Acunia N.V. and its * * licensors, if any. * * * * This software may only be used in accordance with the corresponding * * license agreement. Any unauthorized use, duplication, transmission, * * distribution or disclosure of this software is expressly forbidden. * * * * This Copyright notice may not be removed or modified without prior * * written consent of Acunia N.V. * * * * Acunia N.V. reserves the right to modify this software without notice. * * * * Acunia N.V. * * Philips-site 5, box 3 info@acunia.com * * 3001 Leuven http://www.acunia.com * * Belgium - EUROPE * **************************************************************************/ package com.acunia.wonka.rudolph.keyboard; import java.awt.*; import java.awt.event.*; import java.util.*; public class KeyboardJapanese extends Keyboard { private Vector keys_hira; private Vector keys_kata; private Vector keys_nrs; private Vector keys_common; private Vector keys_common_hira; private Vector keys_common_kata; private Vector keys_shift_hira; private Vector keys_shift_kata; private Vector current_keys; private KeyboardButton k_123_1; private KeyboardButton k_123_2; private KeyboardButton k_shift; private KeyboardButton k_caps; private KeyboardButton k_ctrl; private KeyboardButton k_kata; private KeyboardButton k_hira; private KeyboardButton k_accent; private KeyboardButton k_circle; private KeyboardButton k_backspace; private KeyboardButton lastPressed = null; private KeyboardButton lastKey = null; // private Image background1; // private Image background2; private boolean f_caps = false; private boolean f_shift = false; private boolean f_num = false; private boolean f_ctrl = false; private boolean f_hira = true; private Component lastSource; public KeyboardJapanese() { super(); // background1 = Toolkit.getDefaultToolkit().createImage(background1_data); // background2 = Toolkit.getDefaultToolkit().createImage(background2_data); current_keys = keys_hira; } protected void buildKbd() { /* ** The different lists of keys. */ keys_hira = new Vector(); keys_kata = new Vector(); keys_nrs = new Vector(); keys_shift_hira = new Vector(); keys_shift_kata = new Vector(); keys_common_hira = new Vector(); keys_common_kata = new Vector(); keys_common = new Vector(); /* ** Common keys */ k_123_1 = new KeyboardButtonText("123", new int[]{ 0, 19, 19, 0}, new int[]{ 0, 0, 16, 16}, 0, '\0'); k_123_2 = new KeyboardButtonText("123", new int[]{ 0, 19, 19, 0}, new int[]{ 0, 0, 20, 20}, 0, '\0'); k_shift = new KeyboardButtonText("Shift", new int[]{ 0, 33, 33, 0}, new int[]{ 48, 48, 64, 64}, KeyEvent.VK_SHIFT, '\0'); k_caps = new KeyboardButtonText("CAP", new int[]{ 0, 29, 29, 0}, new int[]{ 32, 32, 48, 48}, KeyEvent.VK_CAPS_LOCK, '\0'); k_ctrl = new KeyboardButtonText("Ctrl", new int[]{ 0, 22, 22, 0}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_CONTROL, '\0'); k_backspace = new KeyboardButtonPoly(new int[]{4, 9, 9, 14, 14, 9, 9}, new int[]{8, 3, 6, 6, 10, 10, 13}, new int[]{221, 239, 239, 221}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_BACK_SPACE, '\0'); k_hira = new KeyboardButtonTextJapanese("\u30ab\u30bf", new int[]{ 22, 44, 44, 22}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_UNDEFINED, '\0', 0); k_kata = new KeyboardButtonTextJapanese("\u3072\u3089", new int[]{ 22, 44, 44, 22}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_UNDEFINED, '\0', 0); k_accent = new KeyboardButtonTextJapanese("\u309b", new int[]{193, 208, 208, 193}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u309b', 0); k_circle = new KeyboardButtonTextJapanese("\u309c", new int[]{208, 224, 224, 208}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u309c', 0); keys_common.add(k_123_1); keys_common.add(new KeyboardButtonTextJapanese("\u3078", new int[]{178, 192, 192, 178}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3078', 2)); keys_common.add(new KeyboardButtonTextJapanese("\u30fc", new int[]{192, 207, 207, 192}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30fc', 0)); keys_common.add(new KeyboardButtonTextJapanese("\u300c", new int[]{207, 221, 221, 207}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u300c', 0)); keys_common.add(k_backspace); keys_common.add(new KeyboardButtonText("Tab", new int[]{ 0, 25, 25, 0}, new int[]{16, 16, 32, 32}, KeyEvent.VK_TAB, '\0')); keys_common.add(k_accent); keys_common.add(k_circle); keys_common.add(new KeyboardButtonTextJapanese("\u300d", new int[]{224, 239, 239, 224}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u300d', 0)); keys_common.add(k_caps); keys_common.add(new KeyboardButtonTextJapanese("\u3002", new int[]{212, 227, 227, 212}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u3002', 0)); keys_common.add(new KeyboardButtonPoly(new int[]{-6, -2, -3, 4, 4, 6, 6, -3, -2}, new int[]{24, 20, 23, 23, 21, 21, 25, 25, 28}, new int[]{227, 239, 239, 213, 213, 227}, new int[]{32, 32, 64, 64, 48, 48}, KeyEvent.VK_ENTER, '\n')); keys_common.add(k_shift); keys_common.add(new KeyboardButtonTextJapanese("\u3001", new int[]{198, 213, 213, 198}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u3001', 0)); keys_common.add(k_ctrl); keys_common.add(new KeyboardButtonTextJapanese("\u30fb", new int[]{ 44, 62, 62, 44}, new int[]{64, 64, 80, 80}, KeyEvent.VK_UNDEFINED, '\u30fb', 0)); keys_common.add(new KeyboardButtonText("?", new int[]{ 62, 80, 80, 62}, new int[]{64, 64, 80, 80}, KeyEvent.VK_UNDEFINED, '?')); keys_common.add(new KeyboardButtonText(" ", new int[]{ 80, 167, 167, 80}, new int[]{64, 64, 80, 80}, KeyEvent.VK_SPACE, ' ')); keys_common.add(new KeyboardButtonPoly(new int[]{8, 4, 7, 7, 9, 9, 12}, new int[]{4, 8, 7, 12, 12, 7, 8}, new int[]{167, 185, 185, 167}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_UP, '\0')); keys_common.add(new KeyboardButtonPoly(new int[]{8, 4, 7, 7, 9, 9, 12}, new int[]{12, 8, 9, 4, 4, 9, 8}, new int[]{185, 203, 203, 185}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_DOWN, '\0')); keys_common.add(new KeyboardButtonPoly(new int[]{5, 9, 8, 13, 13, 8, 9}, new int[]{8, 4, 7, 7, 9, 9, 12}, new int[]{203, 221, 221, 203}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_LEFT, '\0')); keys_common.add(new KeyboardButtonPoly(new int[]{13, 9, 10, 5, 5, 10, 9}, new int[]{8, 4, 7, 7, 9, 9, 12}, new int[]{221, 239, 239, 221}, new int[]{ 64, 64, 80, 80}, KeyEvent.VK_RIGHT, '\0')); /* ** Hiragana keyboard. */ keys_common_hira.add(new KeyboardButtonTextJapanese("\u306c", new int[]{ 19, 33, 33, 19}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u306c', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3075", new int[]{ 33, 48, 48, 33}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3075', 2)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u307b", new int[]{163, 178, 178, 163}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u307b', 2)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u305f", new int[]{ 25, 40, 40, 25}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u305f', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3066", new int[]{ 40, 56, 56, 40}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u3066', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3059", new int[]{ 71, 86, 86, 71}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u3059', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u304b", new int[]{ 86, 101, 101, 86}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u304b', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3093", new int[]{101, 117, 117, 101}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u3093', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u306a", new int[]{117, 132, 132, 117}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u306a', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u306b", new int[]{132, 147, 147, 132}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u306b', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3089", new int[]{147, 163, 163, 147}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u3089', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u305b", new int[]{163, 178, 178, 163}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u305b', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3092", new int[]{178, 193, 193, 178}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u3092', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3061", new int[]{ 29, 44, 44, 29}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u3061', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3068", new int[]{ 44, 59, 59, 44}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u3068', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3057", new int[]{ 59, 75, 75, 59}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u3057', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u306f", new int[]{ 75, 90, 90, 75}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u306f', 2)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u304d", new int[]{ 90, 105, 105, 90}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u304d', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u304f", new int[]{105, 120, 120, 105}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u304f', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u307e", new int[]{120, 136, 136, 120}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u307e', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u306e", new int[]{136, 151, 151, 136}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u306e', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u308a", new int[]{151, 166, 166, 151}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u308a', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u308c", new int[]{166, 181, 181, 166}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u308c', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3051", new int[]{181, 197, 197, 181}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u3051', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3080", new int[]{197, 212, 212, 197}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u3080', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3055", new int[]{ 48, 63, 63, 48}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u3055', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u305d", new int[]{ 63, 78, 78, 63}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u305d', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3072", new int[]{ 78, 93, 93, 78}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u3072', 2)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3053", new int[]{ 93, 108, 108, 93}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u3053', 1)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u307f", new int[]{108, 123, 123, 108}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u307f', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3082", new int[]{123, 138, 138, 123}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u3082', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u306d", new int[]{138, 153, 153, 138}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u306d', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u308b", new int[]{153, 168, 168, 153}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u308b', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u3081", new int[]{168, 183, 183, 168}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u3081', 0)); keys_common_hira.add(new KeyboardButtonTextJapanese("\u308d", new int[]{183, 198, 198, 183}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u308d', 0)); keys_common_hira.add(k_kata); keys_common_hira.addAll(keys_common); keys_hira.add(new KeyboardButtonTextJapanese("\u3042", new int[]{ 48, 62, 62, 48}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3042', 0)); keys_hira.add(new KeyboardButtonTextJapanese("\u3046", new int[]{ 62, 77, 77, 62}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3046', 1)); keys_hira.add(new KeyboardButtonTextJapanese("\u3048", new int[]{ 77, 91, 91, 77}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3048', 0)); keys_hira.add(new KeyboardButtonTextJapanese("\u304a", new int[]{ 91, 106, 106, 91}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u304a', 0)); keys_hira.add(new KeyboardButtonTextJapanese("\u3084", new int[]{106, 120, 120, 106}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3084', 0)); keys_hira.add(new KeyboardButtonTextJapanese("\u3086", new int[]{120, 134, 134, 120}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3086', 0)); keys_hira.add(new KeyboardButtonTextJapanese("\u3088", new int[]{134, 149, 149, 134}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3088', 0)); keys_hira.add(new KeyboardButtonTextJapanese("\u308f", new int[]{149, 163, 163, 149}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u308f', 0)); keys_hira.add(new KeyboardButtonTextJapanese("\u3044", new int[]{ 56, 71, 71, 56}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u3044', 0)); keys_hira.add(new KeyboardButtonTextJapanese("\u3064", new int[]{ 33, 48, 48, 33}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u3064', 1)); keys_hira.addAll(keys_common_hira); keys_shift_hira.add(new KeyboardButtonTextJapanese("\u3041", new int[]{ 48, 62, 62, 48}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3041', 0)); keys_shift_hira.add(new KeyboardButtonTextJapanese("\u3045", new int[]{ 62, 77, 77, 62}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3045', 0)); keys_shift_hira.add(new KeyboardButtonTextJapanese("\u3047", new int[]{ 77, 91, 91, 77}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3047', 0)); keys_shift_hira.add(new KeyboardButtonTextJapanese("\u3049", new int[]{ 91, 106, 106, 91}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3049', 0)); keys_shift_hira.add(new KeyboardButtonTextJapanese("\u3083", new int[]{106, 120, 120, 106}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3083', 0)); keys_shift_hira.add(new KeyboardButtonTextJapanese("\u3085", new int[]{120, 134, 134, 120}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3085', 0)); keys_shift_hira.add(new KeyboardButtonTextJapanese("\u3087", new int[]{134, 149, 149, 134}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u3087', 0)); keys_shift_hira.add(new KeyboardButtonTextJapanese("\u308e", new int[]{149, 163, 163, 149}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u308e', 0)); keys_shift_hira.add(new KeyboardButtonTextJapanese("\u3043", new int[]{ 56, 71, 71, 56}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u3043', 0)); keys_shift_hira.add(new KeyboardButtonTextJapanese("\u3063", new int[]{ 33, 48, 48, 33}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u3063', 0)); keys_shift_hira.addAll(keys_common_hira); /* ** Katakana keyboard. */ keys_common_kata.add(new KeyboardButtonTextJapanese("\u30cc", new int[]{ 19, 33, 33, 19}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30cc', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30d5", new int[]{ 33, 48, 48, 33}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30d5', 2)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30db", new int[]{163, 178, 178, 163}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30db', 2)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30bf", new int[]{ 25, 40, 40, 25}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30bf', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30c6", new int[]{ 40, 56, 56, 40}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30c6', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30b9", new int[]{ 71, 86, 86, 71}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30b9', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30ab", new int[]{ 86, 101, 101, 86}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30ab', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30f3", new int[]{101, 117, 117, 101}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30f3', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30ca", new int[]{117, 132, 132, 117}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30ca', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30cb", new int[]{132, 147, 147, 132}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30cb', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30e9", new int[]{147, 163, 163, 147}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30e9', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30bb", new int[]{163, 178, 178, 163}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30bb', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30f2", new int[]{178, 193, 193, 178}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30f2', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30c1", new int[]{ 29, 44, 44, 29}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30c1', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30c8", new int[]{ 44, 59, 59, 44}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30c8', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30b7", new int[]{ 59, 75, 75, 59}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30b7', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30cf", new int[]{ 75, 90, 90, 75}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30cf', 2)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30ad", new int[]{ 90, 105, 105, 90}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30ad', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30af", new int[]{105, 120, 120, 105}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30af', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30de", new int[]{120, 136, 136, 120}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30de', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30ce", new int[]{136, 151, 151, 136}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30ce', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30ea", new int[]{151, 166, 166, 151}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30ea', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30ec", new int[]{166, 181, 181, 166}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30ec', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30b1", new int[]{181, 197, 197, 181}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30b1', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30e0", new int[]{197, 212, 212, 197}, new int[]{32, 32, 48, 48}, KeyEvent.VK_UNDEFINED, '\u30e0', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30b5", new int[]{ 48, 63, 63, 48}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30b5', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30bd", new int[]{ 63, 78, 78, 63}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30bd', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30d2", new int[]{ 78, 93, 93, 78}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30d2', 2)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30b3", new int[]{ 93, 108, 108, 93}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30b3', 1)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30df", new int[]{108, 123, 123, 108}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30df', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30e2", new int[]{123, 138, 138, 123}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30e2', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30cd", new int[]{138, 153, 153, 138}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30cd', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30eb", new int[]{153, 168, 168, 153}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30eb', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30e1", new int[]{168, 183, 183, 168}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30e1', 0)); keys_common_kata.add(new KeyboardButtonTextJapanese("\u30ed", new int[]{183, 198, 198, 183}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30ed', 0)); keys_common_kata.add(k_hira); keys_common_kata.addAll(keys_common); keys_kata.add(new KeyboardButtonTextJapanese("\u30a2", new int[]{ 48, 62, 62, 48}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30a2', 0)); keys_kata.add(new KeyboardButtonTextJapanese("\u30a6", new int[]{ 62, 77, 77, 62}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30a6', 1)); keys_kata.add(new KeyboardButtonTextJapanese("\u30a8", new int[]{ 77, 91, 91, 77}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30a8', 0)); keys_kata.add(new KeyboardButtonTextJapanese("\u30aa", new int[]{ 91, 106, 106, 91}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30aa', 0)); keys_kata.add(new KeyboardButtonTextJapanese("\u30e4", new int[]{106, 120, 120, 106}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30e4', 0)); keys_kata.add(new KeyboardButtonTextJapanese("\u30e6", new int[]{120, 134, 134, 120}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30e6', 0)); keys_kata.add(new KeyboardButtonTextJapanese("\u30e8", new int[]{134, 149, 149, 134}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30e8', 0)); keys_kata.add(new KeyboardButtonTextJapanese("\u30ef", new int[]{149, 163, 163, 149}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30ef', 0)); keys_kata.add(new KeyboardButtonTextJapanese("\u30a4", new int[]{ 56, 71, 71, 56}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30a4', 0)); keys_kata.add(new KeyboardButtonTextJapanese("\u30c4", new int[]{ 33, 48, 48, 33}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30c4', 1)); keys_kata.addAll(keys_common_kata); keys_shift_kata.add(new KeyboardButtonTextJapanese("\u30a1", new int[]{ 48, 62, 62, 48}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30a1', 0)); keys_shift_kata.add(new KeyboardButtonTextJapanese("\u30a5", new int[]{ 62, 77, 77, 62}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30a5', 0)); keys_shift_kata.add(new KeyboardButtonTextJapanese("\u30a7", new int[]{ 77, 91, 91, 77}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30a7', 0)); keys_shift_kata.add(new KeyboardButtonTextJapanese("\u30a9", new int[]{ 91, 106, 106, 91}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30a9', 0)); keys_shift_kata.add(new KeyboardButtonTextJapanese("\u30e3", new int[]{106, 120, 120, 106}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30e3', 0)); keys_shift_kata.add(new KeyboardButtonTextJapanese("\u30e5", new int[]{120, 134, 134, 120}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30e5', 0)); keys_shift_kata.add(new KeyboardButtonTextJapanese("\u30e7", new int[]{134, 149, 149, 134}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30e7', 0)); keys_shift_kata.add(new KeyboardButtonTextJapanese("\u30ee", new int[]{149, 163, 163, 149}, new int[]{ 0, 0, 16, 16}, KeyEvent.VK_UNDEFINED, '\u30ee', 0)); keys_shift_kata.add(new KeyboardButtonTextJapanese("\u30a3", new int[]{ 56, 71, 71, 56}, new int[]{16, 16, 32, 32}, KeyEvent.VK_UNDEFINED, '\u30a3', 0)); keys_shift_kata.add(new KeyboardButtonTextJapanese("\u30c3", new int[]{ 33, 48, 48, 33}, new int[]{48, 48, 64, 64}, KeyEvent.VK_UNDEFINED, '\u30c3', 0)); keys_shift_kata.addAll(keys_common_kata); /* ** Numerical Keyboard. */ keys_nrs.add(k_123_2); keys_nrs.add(new KeyboardButtonText("[", new int[]{ 19, 36, 36, 19}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_OPEN_BRACKET, '\0')); keys_nrs.add(new KeyboardButtonText("]", new int[]{ 36, 53, 53, 36}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_CLOSE_BRACKET, '\0')); keys_nrs.add(new KeyboardButtonText("{", new int[]{ 53, 70, 70, 53}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_UNDEFINED, '{')); keys_nrs.add(new KeyboardButtonText("}", new int[]{ 70, 87, 87, 70}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_UNDEFINED, '}')); keys_nrs.add(new KeyboardButtonText("7", new int[]{ 93, 113, 113, 93}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_NUMPAD7, '7')); keys_nrs.add(new KeyboardButtonText("8", new int[]{ 113, 133, 133, 113}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_NUMPAD8, '8')); keys_nrs.add(new KeyboardButtonText("9", new int[]{ 133, 153, 153, 133}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_NUMPAD9, '9')); keys_nrs.add(new KeyboardButtonText("#", new int[]{ 159, 179, 179, 159}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_UNDEFINED, '#')); keys_nrs.add(new KeyboardButtonText("%", new int[]{ 179, 199, 199, 179}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_UNDEFINED, '%')); keys_nrs.add(new KeyboardButtonText("=", new int[]{ 199, 219, 219, 199}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_UNDEFINED, '=')); keys_nrs.add(new KeyboardButtonPoly(new int[]{5, 10, 10, 15, 15, 10, 10}, new int[]{10, 5, 8, 8, 12, 12, 15}, new int[]{ 219, 239, 239, 219}, new int[]{ 0, 0, 20, 20}, KeyEvent.VK_BACK_SPACE, '\0')); keys_nrs.add(new KeyboardButtonText("^", new int[]{ 0, 19, 19, 0}, new int[]{20, 20, 40, 40}, KeyEvent.VK_UNDEFINED, '^')); keys_nrs.add(new KeyboardButtonText(",", new int[]{ 19, 36, 36, 19}, new int[]{20, 20, 40, 40}, KeyEvent.VK_SEPARATER, ',')); keys_nrs.add(new KeyboardButtonText(".", new int[]{ 36, 53, 53, 36}, new int[]{20, 20, 40, 40}, KeyEvent.VK_DECIMAL, '.')); keys_nrs.add(new KeyboardButtonText("<", new int[]{ 53, 70, 70, 53}, new int[]{20, 20, 40, 40}, KeyEvent.VK_UNDEFINED, '<')); keys_nrs.add(new KeyboardButtonText(">", new int[]{ 70, 87, 87, 70}, new int[]{20, 20, 40, 40}, KeyEvent.VK_UNDEFINED, '>')); keys_nrs.add(new KeyboardButtonText("4", new int[]{ 93, 113, 113, 93}, new int[]{20, 20, 40, 40}, KeyEvent.VK_NUMPAD4, '4')); keys_nrs.add(new KeyboardButtonText("5", new int[]{ 113, 133, 133, 113}, new int[]{20, 20, 40, 40}, KeyEvent.VK_NUMPAD5, '5')); keys_nrs.add(new KeyboardButtonText("6", new int[]{ 133, 153, 153, 133}, new int[]{20, 20, 40, 40}, KeyEvent.VK_NUMPAD6, '6')); keys_nrs.add(new KeyboardButtonText("+", new int[]{ 159, 179, 179, 159}, new int[]{20, 20, 40, 40}, KeyEvent.VK_ADD, '+')); keys_nrs.add(new KeyboardButtonText("-", new int[]{ 179, 199, 199, 179}, new int[]{20, 20, 40, 40}, KeyEvent.VK_SUBTRACT, '-')); keys_nrs.add(new KeyboardButtonText("*", new int[]{ 199, 219, 219, 199}, new int[]{20, 20, 40, 40}, KeyEvent.VK_MULTIPLY, '*')); keys_nrs.add(new KeyboardButtonText("/", new int[]{ 219, 239, 239, 219}, new int[]{20, 20, 40, 40}, KeyEvent.VK_DIVIDE, '/')); keys_nrs.add(new KeyboardButtonText(" ", new int[]{ 0, 19, 19, 0}, new int[]{40, 40, 60, 60}, KeyEvent.VK_UNDEFINED, '\0')); keys_nrs.add(new KeyboardButtonText(" ", new int[]{ 19, 36, 36, 19}, new int[]{40, 40, 60, 60}, KeyEvent.VK_UNDEFINED, '\0')); keys_nrs.add(new KeyboardButtonText(":", new int[]{ 36, 53, 53, 36}, new int[]{40, 40, 60, 60}, KeyEvent.VK_UNDEFINED, ':')); keys_nrs.add(new KeyboardButtonText("\\", new int[]{ 53, 70, 70, 53}, new int[]{40, 40, 60, 60}, KeyEvent.VK_BACK_SLASH, '\\')); keys_nrs.add(new KeyboardButtonText("|", new int[]{ 70, 87, 87, 70}, new int[]{40, 40, 60, 60}, KeyEvent.VK_UNDEFINED, '|')); keys_nrs.add(new KeyboardButtonText("1", new int[]{ 93, 113, 113, 93}, new int[]{40, 40, 60, 60}, KeyEvent.VK_NUMPAD1, '1')); keys_nrs.add(new KeyboardButtonText("2", new int[]{ 113, 133, 133, 113}, new int[]{40, 40, 60, 60}, KeyEvent.VK_NUMPAD2, '2')); keys_nrs.add(new KeyboardButtonText("3", new int[]{ 133, 153, 153, 133}, new int[]{40, 40, 60, 60}, KeyEvent.VK_NUMPAD3, '3')); keys_nrs.add(new KeyboardButtonPoly(new int[]{10, 6, 9, 9, 11, 11, 14}, new int[]{6, 10, 9, 14, 14, 9, 10}, new int[]{ 159, 179, 179, 159}, new int[]{40, 40, 60, 60}, KeyEvent.VK_UP, '\0')); keys_nrs.add(new KeyboardButtonPoly(new int[]{10, 6, 9, 9, 11, 11, 14}, new int[]{14, 10, 11, 6, 6, 11, 10}, new int[]{ 179, 199, 199, 179}, new int[]{40, 40, 60, 60}, KeyEvent.VK_DOWN, '\0')); keys_nrs.add(new KeyboardButtonPoly(new int[]{6, 10, 9, 14, 14, 9, 10}, new int[]{10, 6, 9, 9, 11, 11, 14}, new int[]{ 199, 219, 219, 199}, new int[]{40, 40, 60, 60}, KeyEvent.VK_LEFT, '\0')); keys_nrs.add(new KeyboardButtonPoly(new int[]{14, 10, 11, 6, 6, 11, 10}, new int[]{10, 6, 9, 9, 11, 11, 14}, new int[]{ 219, 239, 239, 219}, new int[]{40, 40, 60, 60}, KeyEvent.VK_RIGHT, '\0')); keys_nrs.add(new KeyboardButtonText("$", new int[]{ 0, 19, 19, 0}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '$')); keys_nrs.add(new KeyboardButtonText(" ", new int[]{ 19, 36, 36, 19}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '\0')); keys_nrs.add(new KeyboardButtonText("\u20AC", new int[]{ 36, 53, 53, 36}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '\0')); keys_nrs.add(new KeyboardButtonText("\u00A3", new int[]{ 53, 70, 70, 53}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '\0')); keys_nrs.add(new KeyboardButtonText("\u00A5", new int[]{ 70, 87, 87, 70}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '\0')); keys_nrs.add(new KeyboardButtonText("(", new int[]{ 93, 113, 113, 93}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, '(')); keys_nrs.add(new KeyboardButtonText("0", new int[]{ 113, 133, 133, 113}, new int[]{60, 60, 80, 80}, KeyEvent.VK_NUMPAD0, '0')); keys_nrs.add(new KeyboardButtonText(")", new int[]{ 133, 153, 153, 133}, new int[]{60, 60, 80, 80}, KeyEvent.VK_UNDEFINED, ')')); keys_nrs.add(new KeyboardButtonText("Tab", new int[]{ 159, 183, 183, 159}, new int[]{60, 60, 80, 80}, KeyEvent.VK_TAB, '\0')); keys_nrs.add(new KeyboardButtonText("Space", new int[]{ 183, 221, 221, 183}, new int[]{60, 60, 80, 80}, KeyEvent.VK_SPACE, ' ')); keys_nrs.add(new KeyboardButtonPoly(new int[]{2, 6, 5, 12, 12, 14, 14, 5, 6}, new int[]{10, 6, 9, 9, 7, 7, 11, 11, 14}, new int[]{ 221, 239, 239, 221}, new int[]{60, 60, 80, 80}, KeyEvent.VK_ENTER, '\n')); } public void paint(Graphics g) { if(f_num) { // g.drawImage(background2, 0, 0, null); } else { // g.drawImage(background1, 0, 0, null); } Iterator iter = current_keys.iterator(); while(iter.hasNext()) { KeyboardButton key = (KeyboardButton)iter.next(); key.paint(g); } } private KeyboardButton getKey(int x, int y) { Iterator iter = current_keys.iterator(); while(iter.hasNext()) { KeyboardButton key = (KeyboardButton)iter.next(); if(key.contains(x, y)) { return key; } } return null; } /* ** Mouse events. */ public void mousePressed(MouseEvent event) { KeyboardButton key = getKey(event.getX(), event.getY()); if(key == null) { return; } if(key == k_kata) { current_keys = (f_shift ? keys_shift_kata : keys_kata); f_hira = false; } else if(key == k_hira) { current_keys = (f_shift ? keys_shift_hira : keys_hira); f_hira = true; } else if(key == k_shift) { if(key.getPressed()) { key.setPressed(false); if(f_hira) current_keys = keys_hira; else current_keys = keys_kata; f_shift = false; } else { key.setPressed(true); if(f_hira) current_keys = keys_shift_hira; else current_keys = keys_shift_kata; f_shift = true; } } else if(key == k_caps) { if(key.getPressed()) { f_caps = false; if(f_hira) current_keys = keys_hira; else current_keys = keys_kata; key.setPressed(false); } else { f_caps = true; if(f_hira) current_keys = keys_shift_hira; else current_keys = keys_shift_kata; key.setPressed(true); } lastPressed = null; } else if(key == k_123_1) { current_keys = keys_nrs; f_num = true; k_123_2.setPressed(true); } else if(key == k_123_2) { if(f_caps) { if(f_hira) current_keys = keys_shift_hira; else current_keys = keys_shift_kata; } else { if(f_hira) current_keys = keys_hira; else current_keys = keys_kata; } f_num = false; if(k_shift.getPressed()) { f_shift = false; k_shift.setPressed(false); if(f_caps) { if(f_hira) current_keys = keys_shift_hira; else current_keys = keys_shift_kata; } else { if(f_hira) current_keys = keys_hira; else current_keys = keys_kata; } } } else { KeyEvent ke; Component source = Component.getFocusComponent(); lastPressed = key; lastSource = source; key.setPressed(true); if(source != null) { if((key == k_accent || key == k_circle) && (lastKey instanceof KeyboardButtonTextJapanese)) { int accent = ((KeyboardButtonTextJapanese)lastKey).getAccent(); if(accent >= 1 && key == k_accent) { /* ** First send a backspace to delete the previous character, then send the character with the accent. */ source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, k_backspace.getKeyEvent(), k_backspace.getKeyChar())); source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, k_backspace.getKeyEvent(), k_backspace.getKeyChar())); source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, lastKey.getKeyEvent(), (char)(lastKey.getKeyChar() + 1))); source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, lastKey.getKeyEvent(), (char)(lastKey.getKeyChar() + 1))); } else if(accent >= 2 && key == k_circle) { /* ** First send a backspace to delete the previous character, then send the character with the accent. */ source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, k_backspace.getKeyEvent(), k_backspace.getKeyChar())); source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, k_backspace.getKeyEvent(), k_backspace.getKeyChar())); source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, lastKey.getKeyEvent(), (char)(lastKey.getKeyChar() + 2))); source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, lastKey.getKeyEvent(), (char)(lastKey.getKeyChar() + 2))); } else { /* ** The character has no accents, send the accent by itself. */ source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, key.getKeyEvent(), key.getKeyChar())); source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, key.getKeyEvent(), key.getKeyChar())); } } else { source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, key.getKeyEvent(), key.getKeyChar())); source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, key.getKeyEvent(), key.getKeyChar())); } } lastKey = key; } repaint(); } public void mouseReleased(MouseEvent event) { if(lastPressed != null) { lastPressed.setPressed(false); if(f_shift) { f_shift = false; k_shift.setPressed(false); if(f_caps) { if(f_hira) current_keys = keys_shift_hira; else current_keys = keys_shift_kata; } else { if(f_hira) current_keys = keys_hira; else current_keys = keys_kata; } } if(lastSource != null) { KeyEvent ke = new KeyEvent(lastSource, KeyEvent.KEY_RELEASED, System.currentTimeMillis(), 0, lastPressed.getKeyEvent(), lastPressed.getKeyChar()); lastSource.dispatchEvent(ke); } lastPressed = null; repaint(); } } }