Eclipse插件弹窗菜单仅显示于选中Java文件(CompilationUnit)的问题
解决Eclipse插件右键菜单仅显示在Java文件(而非类元素)上的问题
我懂你的需求:你希望右键菜单只在选中.java文件本身时才弹出,而不是展开文件选中内部的类(IType)时也显示。目前的配置因为适配了IResource,导致IType也能通过扩展名检查,所以菜单会意外出现。
问题根源
你的现有配置里用了<adapt type="org.eclipse.core.resources.IResource">,而IType元素可以被适配为它所属的Java文件的IResource对象,因此扩展名测试org.eclipse.core.resources.extension会通过,导致菜单在选中类时也显示。
解决方案
我们需要直接限制选中的元素是IFile实例(也就是文件本身),而不是通过适配得到的IResource。修改后的配置如下:
<menuContribution allPopups="true" locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions"> <menu id="org.plugin.generate_test.handlers.menus.popupTestMenu2" label="Generate" mnemonic="P2"> <command commandId="org.plugin.generate_test.handlers.commands.generateCommand" id="org.plugin.generate_test.handlers.menus.generateCommand" mnemonic="PC2" style="push"> <visibleWhen checkEnabled="false"> <with variable="activeMenuSelection"> <iterate ifEmpty="false"> <!-- 确保选中的是文件实例,而非类元素 --> <instanceof type="org.eclipse.core.resources.IFile"/> <!-- 验证是.java文件 --> <test property="org.eclipse.core.resources.extension" value="java"/> </iterate> </with> </visibleWhen> </command> </menu> </menuContribution>
关键修改说明
<instanceof type="org.eclipse.core.resources.IFile"/>:这个条件会直接检查选中的元素是否是IFile的实例。当你展开Java文件选中内部的类时,选中的是IType对象,它不属于IFile类型,因此这个条件不满足,菜单就不会显示。- 保留的
<test property="org.eclipse.core.resources.extension" value="java"/>:确保只有扩展名是java的文件才会触发菜单。
这样修改后,右键菜单就只会在你直接选中.java文件时才会出现,完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者squlerr
相关产品推荐
相关产品推荐

