确定SWT的重点

时间:2011-01-07 17:12:23

标签: java swt

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

我能够使用遍历侦听器处理键盘事件,但是使用鼠标点击更改焦点似乎会使我的应用程序神秘化。我似乎无法弄清楚如何找到从前一项中获得焦点的项目。

如果焦点被鼠标事件更改,我也会在FocusLost侦听器中可靠地将焦点设置到另一个窗口小部件时遇到问题。

有什么建议吗?

4 个答案:

答案 0 :(得分:13)

是:

Display.getFocusControl();

答案 1 :(得分:2)

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

否则你可以只保留指向你创建的控件的指针,并将指针与你已知的控制指针进行比较,不是吗?

答案 2 :(得分:2)

由于这是一个棘手的问题,让我在问题的第二部分添加一些内容:

  

如果焦点被鼠标事件更改,我也会在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();
        }
      }
    }); 
  }
});

如果没有异步调用,鼠标事件将撤消在焦点事件中完成的选择。

答案 3 :(得分:1)

getFocusControl返回一个Control,您的项继承自Control。我使用了一堆自定义控件,当我得到它有焦点时,然后通过使用一组if(控制实例的myclass)语句(否则在第一个之后的ifs)确定它到底是什么类 然后,一旦我有了真正的课程,我就会投入到该课程中并调用我在课堂上使用的正确的getter方法。

希望这有帮助,