关于java:setVisible和textField上的requestFocus

setVisible and requestFocus on textField

我有操作线程,因为它是Swing软件EDT。
我希望我的程序绘制对话框窗口,当它出现并且充满数据时,我想集中精力于选定的文本字段。

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

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

观察:但是,当我在主线程中添加一些睡眠(300英里)时,在EDT中引入了一个invokeLater调用和下一个调用之间的时间间隔时,它的工作原理与我想要的一样。

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

问题:如何使事情正常运行,一些同步方法,也许在调用requestFocus()之前检查对话框(可能很难,因为它在其他类中)。

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


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

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

将焦点放在JTextField实例上


requestFocusInWindow()方法只能在可见组件上调用。 这意味着在调用该方法时,框架/对话框必须已经可见。

如果您尝试在模式对话框中执行此操作,则可能会遇到问题。 检出Dialog Focus作为简单的侦听器,您可以用来将焦点放在组件上。