我有 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/