最近,我遇到了一个与JTextField有关的奇怪问题。当我运行以下代码(参见下面的代码)时,在文本字段中键入"0“首先发送一个粘贴操作,然后键入"0”。例如,如果将"text“复制到剪贴板,则在我键入"0”时键入"text0“。类似地,键入"4“将前面的字符替换为"4”(我猜这是一个delete操作,然后键入"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上(通过Windows使用VNC访问);在Windows上一切都按预期运行。
更新:Ubuntu上的程序也没有问题。我还试过使用不同的键盘和VNC查看器。
更新2:版本
红帽:
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)Update 3:尝试在三台不同的红帽计算机上运行程序(在工作时都在同一组中),并尝试在不同的XP计算机上运行程序并重新启动。
更新4:今天我开始工作,发现问题已经神奇地消失了。然而,我真的很高兴知道为什么会发生这种情况,这样我(以及其他很多人都会遇到这个奇怪的问题)知道如何在将来解决这个问题。
发布于 2012-07-18 21:03:49
尝试将这段代码放在程序的开头。
KeyboardFocusManager.setCurrentKeyboardFocusManager(new DefaultKeyboardFocusManager(){
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD){
return true;
}
return super.dispatchKeyEvent(e);
}
});发布于 2012-07-20 12:18:29
很难给出一个准确的答案,但这并不是一个奇怪的现象。通常,当VNC或远程桌面共享发生时,一台机器的键盘和鼠标事件被传输到另一台机器。当此映射完成时,可能存在错误行为的可能性很大,特别是剪贴板复制和粘贴。这种情况不仅发生在Linux世界,也发生在windows世界。
我凭自己的经验告诉你这件事。在我的工作场所,我们经常将rdc放入其他机器,一些运行XP,另一些运行Windows 7。剪贴板在一台机器上复制,在远程机器上粘贴的操作在某些系统上工作,而在另一些系统上失败。
引用另一种使用java和远程桌面访问的经验,我在eclipse上运行了一个java应用程序。当我从其他机器进入我的机器时,我发现eclipse完全无法启动应用程序。要使它工作,我需要首先在我自己的系统上启动它,让应用程序继续运行,然后再从另一个rdc进入我的系统。
试想一下,如果Windows XP和Windows 7属于同一家族,情况就是这样的。人们只能希望,当将Linux和Windows与VNC一起使用时,这种奇怪的事情不会发生。)
如前所述,很难太准确地说明为什么会发生这种情况,但可以肯定地说,这纯粹是在OS级别发生的事情,而不是在swing框架级别上发生的事情。
发布于 2012-07-20 13:36:02
我不确定,但我只是想帮忙:
我在IcedTea方面的经验很糟糕。我不记得到底发生了什么,但那时,安装官方的Java解决了我的问题。Id est: Oracle提供的JRE。
http://java.com/en/download/index.jsp
https://stackoverflow.com/questions/11418540
复制相似问题