Проблемы с JTextField с Numpad
Недавно у меня возникла странная проблема с Java JTextField. Когда я запускаю следующий код (см. Ниже), ввод "0" в текстовое поле сначала отправляет действие вставки, а затем вводит "0" . Например, если "текст" скопирован в буфер обмена, "text0" вводится при вводе "0" . Аналогично, ввод "4" заменяет предыдущий символ "4" (я предполагаю, что это действие удаления, затем набирается "4" ). Ввод "7" очищает текстовое поле до ввода "7".
Вот код:
import javax.swing.JFrame;
import javax.swing.JTextField;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
JTextField text = new JTextField();
frame.add(text);
frame.setSize(500, 500);
frame.setVisible(true);
}
}
Проблема возникает в Red Hat Linux (доступ к ней осуществляется с помощью VNC из Windows XP); все работает как ожидается в Window XP.
Обновление: проблем с программой на Ubuntu тоже нет. Я также пробовал использовать разные клавиатуры и зрители VNC.
Обновление 2: Версии Java
Для Red Hat:
java version "1.6.0_17"
OpenJDK Runtime Environment (IcedTea6 1.7.7) (rhel-1.17.b17.el5-x86_64)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
Для XP:
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)
Обновление 3. Пробовал запуск программы на трех разных компьютерах Red Hat (все в одной группе на работе) и дополнительно попытался запустить ее с другого компьютера XP и перезапустить.
Обновление 4. Сегодня я пришел на работу, чтобы найти, что проблема волшебно ушла. Тем не менее, было бы неплохо узнать, почему это произошло в первую очередь, чтобы я (и кто-то другой, кто сталкивается с этой странной проблемой) знает, как это исправить в будущем.
Ответы
Ответ 1
Попробуйте поставить этот код в начале вашей программы.
KeyboardFocusManager.setCurrentKeyboardFocusManager(new DefaultKeyboardFocusManager(){
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD){
return true;
}
return super.dispatchKeyEvent(e);
}
});
Ответ 2
Ну, трудно дать точный ответ, почему, но это не очень странные явления. Обычно, когда происходит совместное использование VNC или удаленного рабочего стола, события клавиатуры и мыши одного компьютера передаются на другую машину. Когда это сопоставление выполняется, может быть справедливая вероятность того, что может быть ошибочное поведение, особенно с копией буфера обмена, вставкой. Это происходит не только в мире Linux, но и в мире Windows.
Я рассказываю это по собственному опыту. На моем рабочем месте мы часто используем rdc на других машинах, некоторые из которых работают с XP и некоторые под управлением Windows 7. Действие копии буфера обмена на одной машине и вставка на удаленной машине работает на некоторых системах и не работает на других.
Цитата другого такого опыта использования java и удаленного доступа к рабочему столу, у меня есть java-приложение, работающее на моем затмении. Когда я rdc в мою машину с некоторых других машин, я нахожу, что eclipse полностью не может запустить приложение. Чтобы он работал, мне нужно сначала запустить его в своей собственной системе, сохранить приложение, а затем rdc из другого в мое.
Только для того, чтобы представить, если это относится к Windows XP и Windows 7, которые, как известно, принадлежат к одному и тому же семейству. Можно только надеяться, что что-то неловкое, как это может не произойти при использовании Linux и Windows вместе с VNC:)
Как уже говорилось, трудно быть слишком точным в отношении того, почему это происходит, но можно с уверенностью сказать, что это чисто то, что происходит на OS до уровня ОС, а не на уровне фреймов swing.
Ответ 3
Я не уверен, но я просто отвечаю, пытаясь помочь:
Мой опыт работы с IcedTea плох. Я точно не помню, что произошло, но в то время, когда официальная Java JRE решила мои проблемы. Id est: JRE предоставляется Oracle.
http://java.com/en/download/index.jsp
Ответ 4
Это, похоже, известная проблема с VNC. Согласно официальному веб-сайту VNC:
Клавиша Num Lock может быть не синхронизирована. Отсоедините, нажмите один раз кнопку Num Lock компьютера клиента и затем снова подключитесь.
Источник: http://www.realvnc.com/products/viewerplus/known-issues/
Это также отображается в FAQ VNC:
Q. Клавиатура не работает/клавиши делают странные вещи!
Существует одна общая проблема, которая может вызвать это. Если нажата клавиша модификатора, такая как Shift, Ctrl или Alt, а окно просмотра затем теряет фокус или умирает, сообщение "key release" никогда не попадает на зрителя и, следовательно, никогда не попадает на удаленный сервер. Удаленная машина тогда подумает, что M является Ctrl-M и т.д. Мы сделали разные вещи, чтобы уменьшить вероятность этого; зрители выпускают различные модификаторы автоматически, когда они теряют фокус, например, но все равно могут возникать и могут сбивать с толку, когда это происходит. Решение легко: просто нажмите и отпустите ключ-модификатор, который застрял. Если вы не знаете, что это такое, попробуйте их по одному.
Источник: http://www-hep.nhn.ou.edu/d0/software/vnc-3.3.2r2/faq.html
Если эта информация свидетельствует о вашей проблеме, может случиться так, что когда проблема "волшебным образом исчезла", Num Pad просто синхронизировался с VNC в этот день и не синхронизировался с другими (что, конечно, означает, что проблема может возникнуть снова).
Ответ 5
Проверьте "Отключить режим клавиатуры приложения" в разделе "Функции терминала".