我有动作线程,因为它是Swing软件,EDT。
我希望我的程序绘制对话框窗口,当它出现并且它充满了数据时,我希望将焦点放在选定的文本字段上。
代码流:当我执行时,它将运行主线程,它调用方法在EDT上的invokeLater中绘制对话框。然后程序继续执行,在主线程中,它再次使用invokeLater调用在ED线程中运行的下一个方法。
问题:当我正常运行时,它不会关注我的文本字段。
观察:但是当我向主线程添加一些睡眠(300毫安)时,在EDT中引入一个invokeLater调用和下一个调用之间的时间间隔,它就像我想要的那样工作。
在我看来,添加到AWT队列的两个动作必须分开一段时间,否则第二个动作不起作用。我的意思是对话框中的setVisible(true),然后是textField上的requestFocus()。也许requestFocus()仅在看到绘制对话框窗口时才有效?
问题:如何让事情有效,一些同步方法,可能在调用requestFocus()之前检查对话框(可能很难,因为它在其他类中)。
解决方案:我忘记了最重要的事情 - 在调用setVisible()之后我接下来要调用setEnabled(false),这样用户在数据填充完成之前就无法做任何事情。问题在于,在setEnabled()中我还将任务添加到AWT队列(通过invokeLater())。此任务导致后续步骤的损坏。我现在要修复的是从invokeAndWait()里面的主线程调用这个setEnabled(false)。如果我理解正确,现在首先调用对话框弹出部分,然后主线程等待直到EDT继续他的工作,然后调用setEnabled(false)。因此技术上用户在绘制窗口后无法执行任何操作,这对我来说很有意义。
无论如何,谢谢你的回复。
答案 0 :(得分:3)
最好从对话框中调用焦点设置。在对话框中添加WindowListener
并使用
public void windowOpened(WindowEvent e)
public void windowActivated(WindowEvent e);
将焦点设置在JTextField
实例
答案 1 :(得分:1)
requestFocusInWindow()
方法只能在可见组件上调用。这意味着在调用方法时,框架/对话框必须已经可见。
如果您尝试在模态对话框中执行此操作,则可能会遇到问题。查看Dialog Focus
以获取可用于设置组件焦点的简单侦听器。