JTextField Проблемы с Numpad

Недавно я столкнулся со странной проблемой с Java JTextField. Когда я запускаю следующий код (см. ниже), ввод «0» в текстовое поле сначала отправляет действие вставки, а затем вводит «0». Например, если «текст» копируется в буфер обмена, «текст0» печатается, когда я набираю «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); все работает, как и ожидалось, в Windows XP.

Обновление: Проблем с программой в Ubuntu тоже нет. Я также пробовал использовать разные клавиатуры и программы просмотра VNC.

Обновление 2: версии Java

Для Красной Шляпы:

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


person lrAndroid    schedule 10.07.2012    source источник
comment
странно... похоже, это может быть проблема с раскладкой клавиатуры? Глупо, я знаю, но вы убедились, что блокировка цифровой клавиатуры включена и работает должным образом в других приложениях Red Hat?   -  person bcr    schedule 10.07.2012
comment
Блокировка цифровой клавиатуры включена, и все работает нормально при наборе текста в других программах. Я также пробовал использовать другую клавиатуру - не повезло.   -  person lrAndroid    schedule 10.07.2012
comment
Кое-что нашел здесь: rvdavid.net/ Это, конечно, Ubuntu, но может ли это быть что-то похожее в вашем случае?   -  person vaisakh    schedule 10.07.2012
comment
Спасибо за предложение, но это не исправит - моя цифровая клавиатура по-прежнему позволяет мне вводить числа, проблема заключается в действиях, которые она отправляет до ввода чисел.   -  person lrAndroid    schedule 10.07.2012
comment
Остальная часть клавиатуры работает нормально под linux?   -  person Rorchackh    schedule 14.07.2012
comment
Да, похоже, что проблемы только с цифровой клавиатурой.   -  person lrAndroid    schedule 16.07.2012
comment
Какой клиент и сервер VNC вы используете?   -  person 101100    schedule 16.07.2012
comment
Помимо операционных систем, которые вы используете, вы также используете одни и те же JRE на обеих машинах?   -  person WhyNotHugo    schedule 16.07.2012
comment
REALVnc для сервера, программа просмотра RealVNC/TightVnc на XP.   -  person lrAndroid    schedule 16.07.2012
comment
Это может показаться глупым. Попробуйте перезагрузить компьютер и повторить попытку.   -  person anthoon    schedule 17.07.2012
comment
Я пробовал это на трех машинах с Linux (одна и та же группа на работе) и дважды перезапускал компьютер с XP, но проблемы все еще были.   -  person lrAndroid    schedule 17.07.2012


Ответы (5)


Попробуйте поместить этот код в начало вашей программы.

KeyboardFocusManager.setCurrentKeyboardFocusManager(new DefaultKeyboardFocusManager(){
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD){
            return true;
        }
        return super.dispatchKeyEvent(e);
    }
});
person elias    schedule 18.07.2012

Трудно дать точный ответ, почему, но на самом деле это не странное явление. Обычно, когда происходит совместное использование VNC или удаленного рабочего стола, события клавиатуры и мыши одной машины передаются на другую машину. Когда это сопоставление выполнено, вполне вероятно, что может быть ошибочное поведение, особенно при копировании буфера обмена, вставке. Это происходит не только в мире Linux, но и в мире Windows.

Говорю это по собственному опыту. На моем рабочем месте мы часто подключаемся к другим машинам, некоторые из которых работают с XP, а некоторые - с Windows 7. Копирование буфера обмена на одной машине и вставка на удаленную машину работает на некоторых системах и не работает на других.

Цитируя еще один такой опыт с java и доступом к удаленному рабочему столу, у меня есть java-приложение, работающее на моем eclipse. Когда я подключаюсь к своей машине с некоторых других машин, я обнаруживаю, что eclipse совершенно не может запустить приложение. Чтобы это работало, мне нужно сначала запустить его в моей собственной системе, оставить приложение работающим, а затем rdc из другого в мою.

Просто представьте, если это так в случае с Windows XP и Windows 7, которые, как известно, принадлежат к одному и тому же семейству. Остается только надеяться, что при использовании Linux и Windows вместе с VNC ничего подобного не произойдет :)

Как уже говорилось, трудно быть слишком точным в отношении того, почему это происходит, но можно с уверенностью сказать, что это происходит исключительно на уровне ОС для ОС, а не на уровне среды Swing.

person Vamsi Emani    schedule 20.07.2012

Я не уверен, но я просто отвечаю, пытаясь помочь:

Мой опыт с IcedTea плохой. Я не могу точно вспомнить, что произошло, но тогда установка официальной Java JRE решила мои проблемы. Идентификатор: JRE, предоставленная Oracle.

http://java.com/en/download/index.jsp

person Martijn Courteaux    schedule 20.07.2012

Кажется, это известная проблема с VNC. Согласно официальному сайту VNC:

Клавиша Num Lock может быть не синхронизирована. Отключитесь, нажмите клавишу Num Lock на клиентском компьютере один раз, а затем снова подключитесь.

Источник: http://www.realvnc.com/products/viewerplus/known-issues/

Это также отображается в часто задаваемых вопросах VNC:

Q. Клавиатура не работает / клавиши ведут себя странно!

Есть одна распространенная проблема, которая может вызвать это. Если нажата клавиша-модификатор, такая как Shift, Ctrl или Alt, а затем окно средства просмотра теряет фокус или умирает, сообщение «освобождение клавиши» никогда не доходит до средства просмотра и, следовательно, никогда не доходит до удаленного сервера. Тогда удаленная машина будет думать, что M — это Ctrl-M и т. д. Мы предприняли ряд действий, чтобы уменьшить вероятность этого; например, зрители автоматически выпускают различные модификаторы, когда теряют фокус, но это все равно может происходить и может сбивать с толку, когда это происходит. Решение простое: просто нажмите и отпустите застрявшую клавишу-модификатор. Если вы не знаете, что это такое, попробуйте их по одному.

Источник: http://www-hep.nhn.ou.edu/d0/software/vnc-3.3.2r2/faq.html

Если эта информация указывает на вашу проблему, то, возможно, когда проблема волшебным образом исчезла, цифровой блок просто синхронизировался с VNC в этот день и не синхронизировался в другие (что, конечно, означает, что проблема может возникнуть). опять таки).

person asteri    schedule 18.07.2012
comment
Почему же тогда проблема возникает только в программе Java (созданной с помощью Eclipse), но не возникает ни в каких других программах? Кроме того, проблема связана только с клавишами цифровой клавиатуры, а не со всей клавиатурой. Кроме того, какая клавиша-модификатор может даже вызвать вставку клавиши 0 на цифровой клавиатуре? - person lrAndroid; 18.07.2012
comment
Итак, когда вы используете Num Pad в других приложениях (в Red Hat через VNC), он работает нормально, в то время как в программе Java он работает со сбоями? - person asteri; 18.07.2012
comment
Правильный. Казалось, что проблема возникает только в моих программах Java. - person lrAndroid; 18.07.2012

Установите флажок «Отключить режим клавиатуры приложения» в разделе «Терминал», функции.

person hellzone    schedule 16.07.2012
comment
Я предполагаю, что вы имеете в виду сделать это в Putty? Неудачно. - person lrAndroid; 16.07.2012
comment
Терминал, особенности? О чем ты говоришь? - person WhyNotHugo; 16.07.2012