我知道我可以通过使用isFocusControl()
来查看特定小部件是否在SWT中具有控制权。但是,当我的预期窗口小部件没有焦点时,我如何确定是什么(换句话说,什么把焦点带走了)?
我能够使用遍历侦听器处理键盘事件,但是使用鼠标点击更改焦点似乎会使我的应用程序神秘化。我似乎无法弄清楚如何找到从前一项中获得焦点的项目。
如果焦点被鼠标事件更改,我也会在FocusLost
侦听器中可靠地将焦点设置到另一个窗口小部件时遇到问题。
有什么建议吗?
答案 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方法。
希望这有帮助,