@ JavaCoder-1337 Не совсем ...
Хотя некоторые switch-case
(трудный путь?) все еще необходимы для обработки некоторых (специальных) символов, большинство символов могутобрабатываться довольно легко.
Сколько вам нужно, зависит от вашей целевой аудитории , но в любом случае вы можете справиться с этим с помощью комбинации:
AWTKeyStroke.getAWTKeyStroke(char yourChar).getKeyCode();
- который обрабатывает самые основные из них;a-zA-Z
переведены в базовую (a-z)
keyEvents, и некоторые другие символы также обрабатываются аналогично (base key only, no modifiers thus no casing is applied)
.
AsВы можете себе представить, что этот метод особенно эффективен для упрощения работы с английским языком, поскольку в языке мало используются акцентированные буквы по сравнению со многими другими.
Normalizer.normalize(String textToNormalize, Form.NFD);
- который разбивает большинство составных (акцентированных) символов,как áàãâä,éèêë,íìîï,etc
, и они являются заглавными эквивалентами, к их базовым элементам.Пример: á (224)
становится a (97)
, за которым следует ´ [769]
.
Если ваш метод send(String text)
может отправлять акценты, простой swap
ударения (в примере это VK_DEAD_ACUTE
) и это письмо, чтобы они получили правильный порядок отправки, и вы получите желаемый á
вывод.Таким образом, устраняется необходимость в фильтре á
.
В сочетании с первым упрощением, для этого примера, получается 1/3 [´]
вместо 3/3 [a,á,´]
switch-case
!
Это лишь некоторые из многих упрощений, которые можно сделать, чтобы сократить этот ужасно длинный метод switch-case
, который (неразумно) предлагается многими коллегами-программистами.
Например, вы можете легко обрабатывать обсадные колонки.путем определения, является ли отправляемый символ заглавными, а затем, если необходимо, определяется текущее состояние колпачка для инвертирования операции с оболочкой:
boolean useShift = Character.isUpperCase(c);
useShift = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK) ? !useShift : useShift;
if (useShift) {
keyPress(KeyEvent.VK_SHIFT);
sendChar(aChar);
keyRelease(KeyEvent.VK_SHIFT);
} else {
sendChar(aChar);
}
Другой вариант (тот, который я использую), которыйеще проще, просто кодировать макрос на инструменте / языке, который (гораздо) больше подходит для такого рода операций (я использую и рекомендую AutoHotKey ), и просто вызывать его выполнение из Java:
Runtime rt = Runtime.getRuntime();
//"Hello World!" is a command-line param, forwarded to the ahk script as it's text-to-send.
rt.exec(".../MyJavaBot/sendString.ahk \"Hello World!\"");