Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SWT/JFace:如何处理每个ViewPart或窗体的Keyevents?_Java_Event Handling_Swt_Eclipse Rcp_Jface - Fatal编程技术网

Java SWT/JFace:如何处理每个ViewPart或窗体的Keyevents?

Java SWT/JFace:如何处理每个ViewPart或窗体的Keyevents?,java,event-handling,swt,eclipse-rcp,jface,Java,Event Handling,Swt,Eclipse Rcp,Jface,我正在构建一个Eclipse应用程序,我试图在按F5键时创建一个启动操作的快捷方式,并在选项卡/视图部分具有焦点时将其设置为默认操作 我读到这是不可能的,或者非常复杂。有什么简单/直接的方法吗 我试过: Display.getCurrent().addFilter(...) this.addKeyListener(new KeyAdapter() {...}) 在构造函数中实现这一点是我的最佳选择: this.getShell().addKeyListener(new KeyAdapter(

我正在构建一个Eclipse应用程序,我试图在按F5键时创建一个启动操作的快捷方式,并在
选项卡
/
视图部分
具有焦点时将其设置为默认操作

我读到这是不可能的,或者非常复杂。有什么简单/直接的方法吗

我试过:

Display.getCurrent().addFilter(...)
this.addKeyListener(new KeyAdapter() {...})

在构造函数中实现这一点是我的最佳选择:

this.getShell().addKeyListener(new KeyAdapter() {
    public void keyPressed(KeyEvent e) {
        if(e.keyCode == SWT.F5) {
            //doAnything()
        }
    }
});
这在加载时不起作用,但是如果我从这个切换到另一个
视图
/
选项卡
开始起作用。但当其他人有注意力时(我不想要),它也会起作用


在开始的时候,只有当焦点在
视图中时,才有可能实现这一点吗?

您应该看看。我认为Eclipse就是这样做的:

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

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

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

如果获得组件事件的侦听器,它将侦听事件。如果此组件发生事件,将通知它

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

您应该在中定义work&然后应该使用本例中给出的键绑定。你可以找到一个很好的例子。希望它能解决您的需要。

您应该在a中定义work,然后使用本例中给出的键绑定。你可以找到一个很好的例子。希望它能解决您的需要。

您需要查看扩展
org.eclipse.ui.bindings
org.eclipse.ui.contexts

  • 定义命令及其处理程序
  • 为命令定义绑定
  • 定义上下文(cxtId)
  • 将上下文与命令关联,使命令仅在上下文处于活动状态时可用
  • 打开视图或窗体时激活上下文

  • 您需要查看扩展
    org.eclipse.ui.bindings
    org.eclipse.ui.context

  • 定义命令及其处理程序
  • 为命令定义绑定
  • 定义上下文(cxtId)
  • 将上下文与命令关联,使命令仅在上下文处于活动状态时可用
  • 打开视图或窗体时激活上下文


  • 谢谢,但是在按钮中执行此操作,例如,如果按钮没有焦点,则不起作用。不管焦点在哪里,我都要这样做。@madtyn你应该把它放在具体的视图/选项卡上,为什么是这个按钮?我没有正确地解释我自己。我试着在组合和对应的Shell上添加一个KeyListener,但是只在Shell上工作,并且具有我在本页开头描述的奇怪行为。这不是奇怪的行为,而是正常的行为,因为您使用了父对象的侦听器,并且事件会传播到所有侦听此类事件的子对象。但是当我在包含所需组件的组合上使用侦听器时(ViewPart中的一个)而不是外壳,它不工作。为什么?这不应该是一样的吗?谢谢,但是在按钮中这样做,例如,如果按钮没有焦点,就不工作。我被要求不管焦点在哪里都这样做。@madtyn你应该把它放在具体的视图/选项卡上,为什么是这个按钮?我没有正确地解释我自己。我尝试在Compo上添加一个KeyListener站点以及相应的Shell上,但仅在Shell上工作,并且具有我在本页开头描述的奇怪行为。这不是奇怪的行为,而是正常行为,因为您使用了父对象的侦听器,并且事件会传播到所有侦听此类事件的子对象。但是当我在Com上使用侦听器时包含所需零部件(ViewPart中的零部件)的位置不是外壳,它不起作用。为什么?这不应该是一样的吗?这似乎对菜单栏有用,但不用于捕捉击键。如果Vogella方法不起作用,我将尝试这个方法。谢谢。这似乎对菜单栏有用,但不用于捕捉击键。如果Vogella方法不起作用,我将尝试这个方法。Thank you.查看您之前添加的评论,我想我只对您的第5点有疑问。打开视图/表单时如何激活上下文?IContextService service=(IContextService)getSite().getService(IContextService.class);使用service.activeContext(contextId)和deactiveContext(context)我刚刚读了最后一条评论。非常感谢。我还不能对评论进行投票,但你可以肯定我对此表示感谢。我几乎做到了,但我无法推翻Eclipse的默认方案。我在另一个问题上考虑了这一点,因为这是一个不同的问题:看看你之前添加的评论,我想我只对你的poi有疑问nt编号5.打开视图/表单时如何激活上下文?IContextService service=(IContextService)getSite().getService(IContextService.class);使用service.activeContext(contextId)和deactiveContext(上下文)我刚刚读了最后一条评论。非常感谢。我还不能对评论进行投票,但你可以确定我对此表示感谢。我几乎做到了,但我无法覆盖Eclipse的默认方案。我在另一个问题上考虑了这一点,因为这是一个不同的问题:你对这里的答案不满意吗?请接受答案。我几乎明白了。我的答案唯一的问题是让它与F12一起工作,这是一个Eclipse默认密钥,但我无法覆盖Eclipse默认方案。我在另一篇文章中提出了这个特定的问题:您对这里的答案不满意吗?请接受答案。我差一点就明白了。我唯一的问题是让它与F12一起工作,这是一个Eclipse默认密钥,但我不知道重写Eclipse默认值