我有操作线程,并且由于它是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并使用

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


将焦点放在JTextField实例上

10-04 10:14