Подтвердить что ты не робот

Проблемы с 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. Сегодня я пришел на работу, чтобы найти, что проблема волшебно ушла. Тем не менее, было бы неплохо узнать, почему это произошло в первую очередь, чтобы я (и кто-то другой, кто сталкивается с этой странной проблемой) знает, как это исправить в будущем.

4b9b3361

Ответ 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

Проверьте "Отключить режим клавиатуры приложения" в разделе "Функции терминала".