`
lizhensan
  • 浏览: 378714 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

rcp 焦点问题

阅读更多

WARNING: Prevented recursive attempt to activate part org.eclipse.ui.views.PropertySheet while still in the middle of activating part VV

 

代码的错误处:

 

 

        if (partBeingActivated != null) {

            if (partBeingActivated.getPart(false) != newPart) {

                WorkbenchPlugin.log(new RuntimeException(NLS.bind(

                        "WARNING: Prevented recursive attempt to activate part {0} while still in the middle of activating part {1}", //$NON-NLS-1$

                        getId(newPart), getId(partBeingActivated))));

            }

            return;

        }



解决办法:
在你的view/edior中添加
@Override
public void setFocus() {
这里不能为空,只要为空就会出现那种错误。

                界面中的控件.setFocus();
  
}

原因:

通过对代码的调试:
没选择一次part
WorkbenchPage.setActivePart  方法会调用三次,
三次调用都是内部调用,只有第三次调用完之后才会执行。
setActivePart 方法最后的
 finally {
            partBeingActivated = null;
        Object blame = newPart == null ? (Object)this : newPart;
            UIStats.end(UIStats.ACTIVATE_PART, blame, label);
        }
这样partBeingActivated的值才为null,
三次调用的流程为:
选择part,出发setActivePart方法,activatePart(newPart);        第一次
setActivePart方法内部又调用自身一次     第二次
第二次的时候就直接return,所以没有进入try里面,不会执行finally
if (partBeingActivated != null) {
            if (partBeingActivated.getPart(false) != newPart) {
                WorkbenchPlugin.log(new RuntimeException(NLS.bind(
                        "WARNING: Prevented recursive attempt to activate part {0} while still in the middle of activating part {1}", //$NON-NLS-1$
                        getId(newPart), getId(partBeingActivated))));
            }
            return;
        }
就在这里return了。
第三次 在  PartPane中  ,这里也是没有进入try里面,不会执行finally
 public void setFocus() {
        requestActivation(); 这里面已经调用了两次

        IWorkbenchPart part = partReference.getPart(true);
        if (part != null) {
            Control control = getControl();
            if (!SwtUtil.isFocusAncestor(control)) {
                // First try to call part.setFocus
                part.setFocus();   这里有去重新调用了一次。如何方法体为空,就不会去调用。
               关键是这里如果你没有设置setFocus,就会被PropertySheet所调用,这个时候就会报错了。。

            }
        }

  这里是最上层的调用,在这个方法最好结束时,才会去去调用
finally {
            partBeingActivated = null;
        Object blame = newPart == null ? (Object)this : newPart;
            UIStats.end(UIStats.ACTIVATE_PART, blame, label);
        }
    }






主要就是把这个方法看明白,这问题就清楚了。
private void setActivePart(IWorkbenchPart newPart, boolean force) {
        // Optimize it.  如何选择同样的,直接return
if (!force && (getActivePart() == newPart)) {
            return;
        }
        如果准备打开的part为不为null,直接return
        if (partBeingActivated != null) {
          如果准备打开的和将要打开的不是同一个part,报错。
            if (partBeingActivated.getPart(false) != newPart) {
                WorkbenchPlugin.log(new RuntimeException(NLS.bind(
                        "WARNING: Prevented recursive attempt to activate part {0} while still in the middle of activating part {1}", //$NON-NLS-1$
                        getId(newPart), getId(partBeingActivated))));
            }
            return;
        }




       //下面的代码没有准备打开的part时,才去执行。
       
            。。。。。
             初始化准备要打开的part
            partBeingActivated = realPartRef;
            
           重新调用这个方法。,这次调用就会直接return
            activatePart(newPart);
            
            actionSwitcher.updateActivePart(newPart);
            
            partList.setActivePart(partref);
        } finally {
            partBeingActivated = null;
        Object blame = newPart == null ? (Object)this : newPart;
            UIStats.end(UIStats.ACTIVATE_PART, blame, label);
        }
    }





模拟类
public class Test {
   public static void main(String[] args) {
  test2();
}
   private static int count=0; 
   private static void test2()
   {
  test(-1);
  
   }
   private static void test(int i)
   {
      count++;
  System.out.println("第"+count+"次");
  if(i==1)
    return;
  
  try {
  i=1;
  test(1);
  test(1);
} catch (Exception e) {
// TODO: handle exception
}finally{
System.out.println("finally");
}
   }
}

执行结果

第1次
第2次
第3次   第三次  有可能被propertysheet调用了。
finally
分享到:
评论

相关推荐

    eclipse rcp demo例子 view editor 图表

    别忘了实现`setFocus()`方法,以便在需要时获取焦点。 对于Editor,创建一个类,继承自`EditorPart`。同样,你需要重写`createPartControl()`来定义编辑器的界面,但编辑器通常会包含更复杂的编辑功能,如代码编辑...

    rcp]-eclipse_rcp

    - **事件(Event)**:SWT组件会触发各种事件,如选择事件(SelectionEvent)和焦点事件(FocusEvent)。 #### 四、创建Eclipse RCP应用 ##### 1. 创建插件项目 - **步骤**: - 首先,创建一个新的Eclipse插件项目。 ...

    电子-一种电机RCP板卡

    文档标签为“资料 文档”,暗示我们关注的焦点是关于电机RCP板卡的技术资料或使用文档。这些文档可能包含电路设计原理、工作流程、安装指南、故障排查步骤、维护手册等内容,对理解和使用电机RCP板卡至关重要。 在...

    JProfiler测试RCP教程

    线程剖析则能帮助你发现可能导致应用卡顿或延迟的线程问题,如死锁。 总的来说,JProfiler是调试和优化Java应用,特别是RCP应用的强大工具,它提供了丰富的视图和分析选项,帮助开发者深入理解程序的运行情况,从而...

    一个基于rcp的交规管理系统

    统计分析模块通过对数据的智能分析,为管理层提供决策支持,如违章热点地图、违规趋势分析等。 在技术实现上,系统充分利用了Eclipse RCP的插件体系,通过插件解耦各个功能模块,使得系统易于维护和升级。此外,...

    NetBeans RCP - 使用 Node & ExplorerManager 结合 BeanTreeView 编写的一个磁盘文件树 Build20080119

    在这个项目中,`ExplorerManager`被用来管理文件树的焦点和选择状态。 **BeanTreeView**: `BeanTreeView`是Swing的一个组件,它是NetBeans RCP提供的,专门用来展示`Node`的树状视图。它将`Node`对象转换为可视化的...

    基于RCP与XML UI技术的金融交易客户端框架的研究

    为了解决金融应用领域系统开发效率低下、系统维护和更新困难等问题,本研究提出了一种基于 Eclipse RCP 和 XML UI 技术的金融交易客户端框架 TRCP(Trading Rich Client Platform)。该框架采用插件作为功能单位的...

    Set TableViewer Cell Focus

    在IT领域,特别是Java Swing和Eclipse RCP开发中,TableViewer是经常被用来展示数据的一个组件。"Set TableViewer Cell Focus"这个话题是关于如何在TableViewer中设置焦点到特定单元格上,这对于实现用户交互和数据...

    运动训练与内皮素研究进展

    内皮素(endothelin,ET)是一种由21个氨基酸组成的...运动训练对心血管病患者的内皮素调节系统的作用,以及内皮素在运动心脏形成中的角色,是当前研究的热点和难点,也是进一步推动ET在运动医学领域中研究的重要方向。

    pluginbuilder

    这里我们关注的焦点是"pluginbuilder",它是一个用于构建和管理插件的工具。从标题和描述中,我们可以看到几个关键概念:CruiseControl、Ant、RCP(Rich Client Platform)以及Headless Build,这些都是与插件开发...

    Setting focus cell in TableViewer

    标题“Setting focus cell in TableViewer”涉及到的是在Eclipse RCP(Rich Client Platform)开发中,如何在TableViewer组件中设置焦点单元格。TableViewer是Eclipse JFace库中的一个关键组件,用于显示和操作表格...

    论文研究-异构多接口WMN信道管理协议实现 .pdf

    总结而言,异构多接口WMN信道管理协议实现的研究,是无线通信领域的一个热点,具有重大的理论价值和实际应用前景。通过合理设计信道管理协议,可以有效利用异构多接口的优势,提高无线Mesh网络的吞吐量和公平性,...

    中国西部寒区流域冰川水文调节功能研究.docx

    本研究使用中国西部寒区流域的冰川径流及总径流模拟预估数据,从趋势与波动变化视角,分析冰川径流的稳定性,在此基础上依据径流变差系数法定义冰川水文调节指数,量化冰川径流调节功能,分析不同时期、RCP2.6 和RCP...

    IBM_Demo_Eclipse-Oct03英文介绍

    7. **Mylyn任务焦点**:Mylyn是Eclipse的一个插件,它将任务管理和开发过程紧密结合起来,帮助开发者专注于当前的任务。 8. **RCP(Rich Client Platform)**:Eclipse的RCP允许开发者构建基于Eclipse框架的桌面...

    基于MVC架构的数据挖掘平台的设计与实现.pdf

    数据挖掘技术因此成为众多学者研究的热点。国外在金融、保险、零售、生物医学等领域已经广泛地应用了数据挖掘技术。在国内,虽然在理论研究上取得了一些成果,但在数据挖掘软件的应用研究方面则相对较新。数据挖掘...

    SWT widgets基本教程

    SWT 提供了一套丰富的 GUI 工具箱,使得开发者能够在 Eclipse RCP 或者独立应用程序中构建出美观且功能强大的用户界面。掌握了这些基础知识后,您可以进一步深入学习 SWT 的高级特性,例如自定义控件、布局管理器等...

    磁化分层等离子体中电磁波传播特性研究.pdf

    随着现代通信技术的飞速发展,电磁波在等离子体中的传播特性研究逐渐成为研究者们关注的焦点。等离子体作为一种电离的气体,其自由电子与电磁波之间相互作用的复杂性,使得电磁波在其中的传播特性与普通介质大为不同...

    论文研究-基于低轨卫星的的MF-TDMA资源分配算法 .pdf

    低轨卫星通信系统中的资源分配问题一直是通信领域关注的热点话题之一,特别是在频谱资源日益紧张的背景下。多频时分多址(MF-TDMA)技术作为低轨卫星通信系统中一种重要的多址接入技术,能够在不同用户之间有效地分配...

Global site tag (gtag.js) - Google Analytics