Java SWT中焦点的确定

Java SWT中焦点的确定,java,swt,Java,Swt,我知道我可以通过使用isFocusControl()查看特定小部件是否在SWT中具有控制权。然而,当我预期的小部件没有焦点时,我如何确定什么有焦点(换句话说,是什么带走了焦点) 我可以用traverse侦听器处理键盘事件,但通过单击鼠标来改变焦点似乎让我的应用程序感到困惑。我似乎不知道如何找到从上一个项目中获取焦点的项目 如果焦点被鼠标事件更改,我还遇到了从FocusLost侦听器中可靠地将焦点设置到另一个小部件的问题 有什么建议吗?是: Display.getFocusControl();

我知道我可以通过使用
isFocusControl()
查看特定小部件是否在SWT中具有控制权。然而,当我预期的小部件没有焦点时,我如何确定什么有焦点(换句话说,是什么带走了焦点)

我可以用traverse侦听器处理键盘事件,但通过单击鼠标来改变焦点似乎让我的应用程序感到困惑。我似乎不知道如何找到从上一个项目中获取焦点的项目

如果焦点被鼠标事件更改,我还遇到了从
FocusLost
侦听器中可靠地将焦点设置到另一个小部件的问题

有什么建议吗?

是:

Display.getFocusControl();

如前所述,Display.getFocusControl()告诉您哪个控件具有焦点。您可以通过setData()方法将信息与小部件关联。您可以对每个可能获得焦点的控件执行此操作,然后getData()将帮助您确定哪个控件具有焦点


否则,您可以只保留指向所创建控件的指针,并将指针与已知控件指针进行比较,否?

getFocusControl返回一个控件,并且您的项继承自该控件。我使用了一组自定义控件,当我得到哪个控件有焦点时,我就通过使用一组if(controlinstanceof myclass)语句(第一个之后是else-ifs)来确定它到底是什么类 一旦我有了真正的类,我就会将其转换为该类,并调用我放入类中的适当getter方法


希望这能有所帮助,

因为这是一个棘手的问题,让我补充一下问题的第二部分:

如果焦点被鼠标事件改变,我也会遇到从FocusLost侦听器中可靠地将焦点设置到另一个小部件的问题

使用鼠标更改焦点时,鼠标事件在焦点事件之后处理。这可能会导致鼠标事件撤销您在焦点事件中应用的更改

例如,要在文本字段通过鼠标单击获得焦点后选择文本字段的内容,异步调用允许延迟选择,直到发送事件

textfield.addFocusListener(new FocusListener() {            
  @Override
  public void focusLost(FocusEvent e) {
  }         
  @Override
  public void focusGained(FocusEvent e) {
    Display.getCurrent().asyncExec(new Runnable() {
      @Override
      public void run() {
        if (!textfield.isDisposed()) {
          textfield.selectAll();
        }
      }
    }); 
  }
});

如果没有异步调用,鼠标事件将撤销在焦点事件中所做的选择。

好的,我试过了。这似乎返回一个控件。当我对它使用toString()来读取控件的焦点时,它只会说Text{}。我能从这个函数中得到更多的细节吗?什么样的细节?为什么不调用控件的任何getter函数来获取更多细节,或者使用getParent()函数查看它在层次结构中的位置。我正在尝试确定夺走焦点的文本组件的名称。在控件可用的getter中,我没有看到一个getter能够做到这一点
getParent()
只是告诉我该元素与其他元素在同一个Shell中。一般来说,这是不可能的。可以有n个变量引用该控件,该控件可能位于数组中,甚至可能根本没有被引用。我们也遇到了同样的问题,使用反射迭代父组件的字段,并查看其中哪个字段包含控件,作为“最佳猜测”,但这并不总是有帮助的。