Java窗口缓冲按键直到用户用鼠标单击

时间:2008-12-10 17:50:09

标签: java swing

这是基本想法:

有一个java窗口(main)打开另一个java窗口(子窗口)。创建子项时,部分初始化会将焦点设置在子窗口的相应文本字段中:

childTextField.requestFocusInWindow();
childTextField.setCaretPosition(0);

通常通过命令行类型界面通过大量的击键打开孩子。当请求窗口时,90%ish的时间,焦点正确地转到子窗口文本字段,用户可以在框中键入。如果打开子项的命令被发送(按下回车键)并且用户在创建新窗口之前立即开始键入,则文本被正确缓冲并在窗口打开后出现在新的文本字段中。

但是,每当用户请求打开子窗口然后开始输入时,他们的文本就不会出现在文本字段中。只有在他们在字段中单击鼠标后,才会显示他们键入的文本。它就像存放在某个地方,直到他们点击它们才出来。

这里真正令人沮丧的是,我似乎无法可靠地重现这个问题。它肯定会发生,但不能经常调试。

当然,幕后还会出现各种其他模式,包括与服务器应用程序的通信,但我不相信它是相关的。

非常感谢任何想法或想法。

4 个答案:

答案 0 :(得分:1)

我遇到了类似的问题。尝试在init()

之后添加此内容
EventQueue.invokeLater(new Runnable() {
    public void run() {
        childtextfield.requestFocus();
        childTextField.setCaretPosition(0);
    }
});

这对我有用。

答案 1 :(得分:0)

初看起来,这听起来好像是实施中的一个错误;密钥应与鼠标事件位于同一事件队列中。但是还有另一个问题:事件队列在与程序main分开的线程中运行;不知道应用程序的其余部分发生了什么,很想知道事件队列线程是否以某种方式被阻塞。

实际上,你在复制它时遇到的困难使这种声音更有可能发生。

调试这种情况需要一点技巧和诡计。如果您使用的是Solaris 10或OS / X,我建议使用dtrace;您可以轻松地在事件队列中放置跟踪点。否则,您可能希望有另一个线程定期丢弃事件队列中的某些内容。

答案 2 :(得分:0)

被阻止的事件队列线程非常可能。不幸的是我在Windows上,所以对我来说没有dtrace,但我肯定会更彻底地探索它。

当然,任何可能有其他想法的人都会受到欢迎。

答案 3 :(得分:0)

事实证明答案并不是那么有趣。在您提到事件队列之后,我进一步挖掘了代码。事实证明,该应用程序有一个自定义键盘焦点管理器。它会执行诸如缓冲等待子窗口打开时键入的文本之类的操作。在打开子窗口的代码中,它调用一个函数(通过一个监听器)来刷新缓冲区,从而将它显示在屏幕上。在10%或更少的时间内,这种情况不会发生。但是,在文本字段内发生的鼠标单击也会附加相同的刷新功能。所以,你猜对了,它没有与窗口的开口齐平,但是在点击鼠标时就是这样。

感谢您的帮助......即使它不是解决方案的确切原因,但它确实指出了我正确的方向。现在我只需要弄清楚为什么在窗口打开时不总是调用flush函数...