Numpad的JTextField问题

时间:2012-07-10 17:20:12

标签: java linux jtextfield redhat numpad

我最近遇到了Java JTextField的一个奇怪问题。当我运行以下代码(见下文)时,在文本字段中键入“0”首先发送粘贴操作,然后键入“0”。例如,如果将“text”复制到剪贴板,则在键入“0”时键入“text0”。类似地,键入“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上(从Windows XP使用VNC访问);一切都在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 :今天我到了工作岗位,发现问题已经神奇地消失了。但是,知道为什么首先发生这种情况真的很好,这样我(以及其他许多遇到这个奇怪问题的人)知道如何在将来修复它。

5 个答案:

答案 0 :(得分:1)

尝试将此代码放在程序的开头。

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

答案 1 :(得分:1)

很难给出准确答案,但这并不是一个奇怪的现象。通常,当发生VNC或远程桌面共享时,一台计算机的键盘和鼠标事件将传输到另一台计算机。完成此映射后,可能存在错误行为的可能性,尤其是剪贴板副本,粘贴。它不仅发生在Linux世界,也发生在Windows世界中。

我根据自己的经验告诉你。在我的工作场所,我们经常使用其他机器,一些运行XP,一些运行Windows 7.剪贴板复制在一台机器上并粘贴在远程机器上的操作在某些系统上运行而在其他系统上运行失败。

使用java和远程桌面访问引用另一个这样的体验,我在我的eclipse上运行了一个java应用程序。当我从其他一些机器进入我的机器时,我发现eclipse完全无法启动应用程序。要使它工作,我需要首先在我自己的系统上启动它,保持应用程序运行,然后将rdc从另一个运行到我的系统中。

想象一下,如果Windows XP和Windows 7的情况属于同一家族。人们只能希望在将Linux和Windows与VNC一起使用时可能不会出现那种古怪的事情:)

如上所述,很难过于准确地说明为什么会这样,但可以肯定的是,这纯粹是在操作系统到操作系统级别而不是在摇摆框架级别上发生的事情。

答案 2 :(得分:1)

我不确定,但我只是在回答以帮助:

我对IcedTea的体验很糟糕。我不记得到底发生了什么,但当时安装官方Java JRE解决了我的问题。 Id est:Oracle提供的JRE。

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

答案 3 :(得分:0)

这似乎是VNC的一个已知问题。根据官方VNC网站:

  

Num Lock键可能不同步。断开连接,按一下客户端计算机的Num Lock键,然后重新连接。

来源:http://www.realvnc.com/products/viewerplus/known-issues/

这也出现在VNC的FAQ中:

  

Q值。键盘不起作用/键做奇怪的事情!

     

有一个常见问题可能导致这种情况。如果按下修改键,例如Shift,Ctrl或Alt,然后查看器窗口失去焦点或死亡,则“键释放”消息永远不会到达查看器,因此永远不会到达远程服务器。然后远程机器会认为M是Ctrl-M等。我们已经做了各种各样的事情来减少这种情况发生的可能性。例如,观众在失去焦点时会自动释放各种修改器,但它仍然会发生,并且可能会造成混乱。解决方案很简单:只需按下并释放卡住的修改键即可。如果您不知道它是哪一个,那么一次尝试一个。

来源:http://www-hep.nhn.ou.edu/d0/software/vnc-3.3.2r2/faq.html

如果此信息表明您的问题,那么可能是当问题“神奇地消失”时,Num Pad当天与VNC同步并且与其他人不同步(这当然意味着问题可能再次出现。)

答案 4 :(得分:-2)

检查终端,功能下的“禁用应用程序键盘模式”。