我正在构建一个 Eclipse 应用程序,我正在尝试创建一个在按 F5 时启动操作的快捷方式,并在
Tab
/ViewPart
获得焦点时将其设置为默认操作。
我读到这是不可能的,或者非常复杂。有什么简单/直接的方法吗?
我尝试过:
Display.getCurrent().addFilter(...)
this.addKeyListener(new KeyAdapter() {...})
...
在构造函数中做到这一点是我最好的:
this.getShell().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.keyCode == SWT.F5) {
//doAnything()
}
}
});
这在加载时不起作用,但如果我从这个切换到另一个
View
/Tab
开始工作。但当其他人有焦点时(我不想要),它也有效。
有没有办法在一开始就让这项工作起作用,并且只有当焦点位于
View
时?
您应该查看RetargetableActions。我认为这是 Eclipse 的做法:
您需要查看扩展
org.eclipse.ui.bindings
和 org.eclipse.ui.contexts
。
如果您获取组件事件的侦听器,它将侦听事件。如果该组件发生事件,它将收到通知。
要在
ViewPart
上添加按键事件的侦听器,我们应该创建能够侦听该事件的控件。
public class SampleView extends ViewPart {
/**
* The ID of the view as specified by the extension.
*/
public static final String ID = "views.SampleView";
private Composite mycomposite;
public void createPartControl(Composite parent) {
mycomposite = new Composite(parent, SWT.FILL);
//then add listener
mycomposite.addKeyListener(keyListener);
}
private KeyListener keyListener = new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
showMessage("key pressed: "+ e.keyCode);
}
};
//the rest of focusing and handle event
private void showMessage(String message) {
MessageDialog.openInformation(
mycomposite.getShell(),
"Sample View",
message);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
mycomposite.setFocus();
}
}
//the end