java - setVisible 和 requestFocus on textField

标签 java swing user-interface awt event-dispatch-thread

我有 Action 线程,因为它是 Swing 软件,EDT。
我希望我的程序绘制对话框窗口,当它出现并且充满数据时,我希望将焦点放在选定的文本字段上。

代码流程:当我执行时,它将运行主线程,该线程在 EDT 上的 invokeLater 中调用方法来绘制对话框。然后程序继续进行,并在主线程中再次使用 invokeLater 调用在 ED 线程中运行的下一个方法。

问题:当我正常运行它时,它不会将焦点放在我的文本字段上。

观察:但是当我向主线程添加一些 sleep (300 毫利斯)时,在 EDT 中的一个 invokeLater 调用和下一个调用之间引入时间间隙,它就像我想要的那样工作

在我看来,添加到 AWT 队列中的两个操作必须间隔一段时间,否则第二个操作将不起作用。我的意思是在对话框上 setVisible(true) ,然后在文本字段上 requestFocus() 。也许 requestFocus() 仅在看到绘制的对话框窗口时才起作用?

问题:我怎样才能让事情正常工作,一些同步方法,也许在调用 requestFocus() 之前检查对话框(可能很难,因为它在其他类中)。


解决方案:我忘记了最重要的事情 - 在调用 setVisible() 之后,我要做的下一步是调用 setEnabled(false),这样用户在数据填充完成之前无法执行任何操作。问题就在那里,在 setEnabled() 中,我还将任务添加到 AWT 队列(通过 invokeLater())。此任务导致后续步骤损坏。我现在要做的就是从主线程中的 invokeAndWait() 中调用 setEnabled(false) 来修复它。如果我理解正确的话,现在首先调用对话框弹出部分,然后主线程等待,直到 EDT 继续其工作,然后调用 setEnabled(false) 。因此从技术上讲,用户在绘制窗口后无法执行任何操作,这对我来说是有意义的。
不管怎样,感谢您的回复。

最佳答案

最好从对话框中调用焦点设置。将 WindowListener 添加到对话框并使用

public void windowOpened(WindowEvent e)
public void windowActivated(WindowEvent e);

将焦点设置在 JTextField 实例上

关于java - setVisible 和 requestFocus on textField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24624539/

相关文章:

java - 用java改变drawableBottom

java - 在java中使用foreach循环时出现奇怪的错误

java - 实现我自己的字符串比较

c++ - 自定义 UI 元素使用的智能指针选择

java - 从另一个项目调用 JDialog?

java - 正确的 FQDN Uri 通过 apache commons UrlValidator 无效

java - 更改 JSpinner 的文本字段位置

Java,JCheckbox - 消耗/阻止所有事件,但仍然启用

Java2d : Set gradient for a lines

user-interface - Unity支持阿拉伯语