JTextField Problem with Numpad

2022-09-02 02:04:40

我最近在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 版本

对于红帽:

    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应用程序在我的eclipse上运行。当我从其他一些机器rdc进入我的机器时,我发现eclipse完全无法启动应用程序。为了让它工作,我需要首先在我自己的系统上启动它,保持应用程序运行,然后rdc从另一个系统进入我的系统。

想象一下,如果这是已知的Windows XP和Windows 7属于同一家族的情况。人们只能希望,当将Linux和Windows与VNC一起使用时,可能不会发生这样古怪的事情:)

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


推荐