SWT / JFace:如何处理每个ViewPart或表单的Keyevents?

时间:2012-10-25 17:48:59

标签: java event-handling swt eclipse-rcp jface

我正在构建一个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

4 个答案:

答案 0 :(得分:2)

你应该看看RetargetableActions。我认为这是Eclipse的做法:

答案 1 :(得分:2)

您应该在handler&那么应该使用本例中给出的键绑定。你可以找到一个很好的例子here。希望它能满足您的需求。

答案 2 :(得分:1)

如果您获得组件事件的监听器,它将监听事件。如果该组件发生事件,将通知它。

要在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

答案 3 :(得分:1)

您需要查看扩展程序org.eclipse.ui.bindingsorg.eclipse.ui.contexts

  1. 定义命令及其处理程序
  2. 为命令
  3. 定义绑定
  4. 定义上下文(cxtId)
  5. 将上下文与命令关联,以便命令仅在上下文处于活动状态时可用
  6. 打开视图或表单时激活上下文。