如何处理 SWT/JFace 中每个 ViewPart 或 Form 的 KeyEvent?

问题描述 投票:0回答:4

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

java event-handling swt jface
4个回答
2
投票

您应该在 handler 中定义工作,然后应该使用本示例中给出的键绑定。您可以在here找到一个很好的例子。希望它能解决您的需求。


2
投票

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


1
投票

您需要查看扩展

org.eclipse.ui.bindings
org.eclipse.ui.contexts

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

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
© www.soinside.com 2019 - 2024. All rights reserved.