Java 如何知道在父组件可见或用户操作时,默认情况下第一个组件上获得的焦点何时启动

Java 如何知道在父组件可见或用户操作时,默认情况下第一个组件上获得的焦点何时启动,java,swing,Java,Swing,我有一个弹出组件,它有第一个组件JTextComponent,我需要在FocusListener中识别从获得焦点到该组件的位置:当弹出窗口出现时,默认情况下该组件获得焦点或用户单击它。我没有找到使用FocusEvent的方法。假设有一个通用用例,到底是什么让您感到困惑?我认为: 编写希望在方法中获得焦点时执行的代码,例如onFocusGaven(布尔默认焦点) 使用onFocusGoven(true)从FocusEvent方法调用它 使用onfocusgoven(false)从MouseAdap

我有一个弹出组件,它有第一个组件JTextComponent,我需要在FocusListener中识别从获得焦点到该组件的位置:当弹出窗口出现时,默认情况下该组件获得焦点或用户单击它。我没有找到使用FocusEvent的方法。

假设有一个通用用例,到底是什么让您感到困惑?我认为:

  • 编写希望在方法中获得焦点时执行的代码,例如onFocusGaven(布尔默认焦点)
  • 使用onFocusGoven(true)从FocusEvent方法调用它
  • 使用onfocusgoven(false)从MouseAdapter方法调用它

  • 默认情况下,当获得焦点时,我需要选择文本,但当用户单击字段时,不需要选择文本。所以,当我有两个监听器时:鼠标和焦点,然后单击事件,这两个监听器都被调用,我看到我的字段被选中了一会儿,然后选择消失了。这不好。我现在明白这个问题了。一种解决方法是使用布尔标志。在类中保留一个标志,表示字段上的单击事件已启动。在焦点侦听器中,如果设置了标志,则不要选择文本(并将其重置,以便下次触发鼠标事件时再次设置)。此机制失败的唯一情况是在鼠标侦听器之前调用焦点侦听器。解决方法是在每次调用鼠标侦听器时取消选择文本。最终,这对我以后添加MouseListener并使用SwingUtilities.invokeLater()调用FocusLictener是很好的。当我有这个事件时,首先调用我的MouseListsner并将标志设置为true,然后调用FocusListener并检查标志是否为true。如果不是这样,则事件不是由鼠标生成的,应该进行适当的处理。如果旗子是真的,我什么也不做,只会再次将旗子设为假。