Eclipse - 以编程方式打开编辑器会导致焦点问题

Posted

技术标签:

【中文标题】Eclipse - 以编程方式打开编辑器会导致焦点问题【英文标题】:Eclipse - Opening editor programmatically causes focus problems 【发布时间】:2012-09-19 10:45:00 【问题描述】:

我正在使用的 Eclipse 插件有点问题。在这个插件中,通常以编程方式打开一种特殊类型的插件专用编辑器;这是由各种视图/编辑器中的各种操作触发的,但打开编辑器的代码是相同的。特定于插件的编辑器可以正常打开;但是,我最近注意到每次打开这些编辑器中的一个时,都会发生奇怪的焦点故障:

当编辑器打开时,它似乎获得焦点,但如果在此之后立即单击先前活动的视图/编辑器,它不会收回焦点。只要单击先前活动的视图/编辑器以外的任何内容,问题就会立即解决,并且焦点会正常恢复。

例如,假设您从 Package Explorer 视图中选择了一个上下文菜单选项,这会导致打开一个编辑器。编辑器正确打开并且似乎有焦点。在此之后,您首先再次单击 Package Explorer,但它没有获得焦点(编辑器似乎仍然有焦点)。您右键单击 Package Explorer,但不会出现 Package Explorer 特定的上下文菜单项。在此之后,单击其他视图,然后再次单击 Package Explorer。现在包资源管理器像往常一样获得焦点。

这是我用来打开编辑器的代码:

IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
final GraphEditorPart gp = (GraphEditorPart) page.openEditor(new NullEditorInput(), "editor.id");

在此之后,编辑器通过 albireo SWT-AWT 桥填充了一些视觉效果(不确定这是否与问题相关——用于主编辑器元素的类是 org.eclipse.albireo.core.SwingControl )。

我认为问题可能是编辑器没有“真正”获得焦点,或者之前的活动视图没有“真正”失去焦点,所以我尝试添加以下行:

page.activate(gp);

但这似乎并没有改变任何东西。为什么会发生这种情况?

【问题讨论】:

您的编辑器部分是否实现了 setFocus() 方法? 是的,确实如此。它的 setFocus() 实际上只是将焦点设置到 SwingControl 实例 我仍然有这个问题,我实际上注意到它发生的情况比我最初想象的要多。几乎每次打开我的插件的一个编辑器或视图时,都会发生某种焦点问题。他们的一个共同点是这个 albireo SWT-AWT SwingControl 东西,所以我更加强烈地怀疑这就是原因。 此外,所有这些问题在 Mac 上表现得更糟 - 例如,有时我的编辑器会无缘无故地获得焦点(即从编辑器堆栈的底部弹出) 【参考方案1】:

包名:rcp_demo.Editor

类名:EmpCommand.java、EmployeeEditor.java 和 EmployeeEditorInput.java


package rcp_demo.Editor;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.handlers.HandlerUtil;

public class EmpCommand extends AbstractHandler 
    public static final String Id = "rcp_demo.Editor.EmpCommand";

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException 

         IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
            IWorkbenchPage page = window.getActivePage();
            IEditorReference[] editors = page.getEditorReferences();
            EmployeeEditorInput input = new EmployeeEditorInput();

            //All Comments are easily understand
            //public class EmployeeEditorInput implements IEditorInput

            for (int i=0; i<editors.length; i++) 

            //List out all Exist editor
            //compare with EmployeeEditor.Id="rcp_demo.Editor.emp";

              if (editors[i].getId().equals(EmployeeEditor.Id)) 

                //public class EmployeeEditor extends EditorPart
                //
                //  public static final String Id="rcp_demo.Editor.emp";
                //      public void createPartControl(Composite parent) .....
                //

                    page.activate(editors[i].getEditor(true));
                    System.out.println("set focus an existing editor(Employee)");
                    return null;
               
            
            try 
                //open new Editor like EmployeeEditor.Id="rcp_demo.Editor.emp";
                page.openEditor(input,EmployeeEditor.Id);
                System.out.println("open Editor(Employee) ");
             catch (PartInitException e) 
                e.printStackTrace();
            
        return null;
    


完整描述此问答访问: Eclipse RCP : have the same editor open in editor window

【讨论】:

请对您的回答进行一些解释,以便其他人理解。 完整描述这个问题和答案请访问:***.com/questions/41606181/…谢谢。 @ChetanBhagat 链接已失效。您能否提供一个新的或解释您的答案?

以上是关于Eclipse - 以编程方式打开编辑器会导致焦点问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在焦点()上以编程方式隐藏jquery mobile中的键盘

如何以编程方式在 ipad 上打开 html 选择选项

以编程方式移除焦点?

UITabBarController 以编程方式添加控制器导致通知打开问题

使用 Ctrl+s 在 Eclipse 中保存多个文件会导致“无法编辑文件”

以编程方式打开 UITableView 编辑操作按钮