JTextField与数字键盘的问题

22

我最近在使用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访问);在Windows 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: 尝试在三台不同的红帽机器上运行程序(都在同一工作组中),并且还尝试从另一台XP计算机上运行它并重新启动。

更新4: 今天我来到公司发现问题神奇地消失了。然而,知道为什么出现这个问题的原因真的很好,这样我(和任何可能遇到这个奇怪问题的人)就知道将来如何解决它。


奇怪...听起来可能是键盘映射问题?很蠢,但你确定小键盘锁定键已经打开,并且在其他红帽应用程序中按预期工作了吗? - bcr
小键盘锁定已开启,在其他程序中输入时一切正常。我也尝试使用不同的键盘,但没有成功。 - lrAndroid
在这里找到了一些东西:http://www.rvdavid.net/how-to-get-the-use-of-your-number-pad-back-in-ubuntu/当然,这是关于Ubuntu的,但在你的情况下可能有类似的解决方法。 - vaisakh
谢谢建议,但这并没有解决问题——我的数字键盘仍然可以输入数字,问题在于它在输入数字之前发送的操作。 - lrAndroid
我已经在三台Linux机器上尝试过了(同一组,在工作中),并且重新启动了XP计算机两次,仍然存在问题。 - lrAndroid
显示剩余6条评论
5个回答

1

很难给出准确的答案,但这并不是一个奇怪的现象。通常情况下,当进行VNC或远程桌面共享时,一个机器的键盘和鼠标事件会传输到另一个机器上。当完成这种映射时,可能存在错误行为,特别是在剪贴板复制和粘贴方面。这种情况不仅发生在Linux世界中,也发生在Windows世界中。

我通过自己的经验来说明这一点。在我的工作场所,我们经常远程桌面连接到其他机器,有些运行XP,有些运行Windows 7。在一个机器上进行剪贴板复制,然后在远程机器上进行粘贴的操作在某些系统上可以正常工作,在其他系统上则失败了。

引用另一个使用Java和远程桌面访问的经验,我在我的Eclipse上运行了一个Java应用程序。当我从其他一些机器远程桌面连接到我的机器时,我发现Eclipse完全无法启动该应用程序。为了使其正常工作,我需要先在自己的系统上启动它,保持应用程序运行状态,然后从其他机器远程桌面连接到我的机器。

想象一下,如果这种情况发生在Windows XP和Windows 7上,它们都属于同一家族。人们只能希望,在使用Linux和Windows进行VNC时不会出现类似的怪异情况 :)

正如所说,很难确定为什么会发生这种情况,但可以肯定的是,这纯粹是在操作系统级别而不是在Swing框架级别上发生的。


1
我不确定,但我只是试图回答以帮助你:
我的IcedTea经验很糟糕。我记不清当时发生了什么,但安装官方Java JRE解决了我的问题。也就是说:由Oracle提供的JRE。

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


1

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

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

0

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

数字锁定键可能不同步。断开连接,按一次客户端计算机的数字锁定键,然后重新连接。

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

这也出现在VNC的常见问题解答中:

问:键盘无法使用/键盘按键出现奇怪的反应!

有一个常见的问题会导致这种情况发生。如果按下修饰键(例如Shift、Ctrl或Alt),然后查看器窗口失去焦点或关闭,则“键释放”消息永远不会到达查看器,因此也不会到达远程服务器。远程计算机将认为M是Ctrl-M等等。我们已经采取了各种措施来减少这种情况发生的可能性;例如,当查看器失去焦点时,查看器会自动释放各种修饰符,但仍然可能发生,并且在发生时可能会令人困惑。解决方法很简单:只需按下并释放卡住的修饰键即可。如果您不知道是哪个键,请逐个尝试。

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

如果这些信息与您的问题相符,那么可能是当问题“神奇地消失”时,数字键盘只是在那一天与VNC同步,而在其他时间不同步(这当然意味着该问题可能会再次出现)。


那么,为什么这个问题只会在Java程序(通过Eclipse创建)中出现,而不会在其他任何程序中出现呢?此外,这个问题只涉及数字键盘上的按键,而不是整个键盘。此外,哪个修饰键甚至会导致数字键盘上的“0”键粘贴? - lrAndroid
那么,当您在其他应用程序(通过VNC在Red Hat上)中使用数字键盘时,它能正常工作,同时在Java程序中出现故障吗? - asteri
正确。这个问题似乎只出现在我的Java程序中。 - lrAndroid

-2

在终端的功能中,勾选“禁用应用程序键盘模式”。


我猜你是指在Putty中做这个?没有成功。 - lrAndroid
终端,功能?你在说什么? - WhyNotHugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接