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 上(使用 VNC 从 Windows XP 访问);一切都在 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:今天我到了工作岗位,发现问题已经神奇地消失了。但是,很高兴知道它为什么会首先发生,这样我(以及许多遇到这个奇怪问题的其他人)知道将来如何解决它。

4

5 回答 5

1

我不确定,但我只是为了提供帮助而回答:

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

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

于 2012-07-20T13:36:02.273 回答
1

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

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

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

试想一下,如果 Windows XP 和 Windows 7 属于同一个家族的话。人们只能希望在将 Linux 和 Windows 与 VNC 一起使用时,不会发生这种古怪的事情:)

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

于 2012-07-20T12:18:29.077 回答
1

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

KeyboardFocusManager.setCurrentKeyboardFocusManager(new DefaultKeyboardFocusManager(){
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD){
            return true;
        }
        return super.dispatchKeyEvent(e);
    }
});
于 2012-07-18T21:03:49.423 回答
0

这似乎是 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

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

于 2012-07-18T18:28:08.263 回答
-2

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

于 2012-07-16T08:47:07.743 回答