如何在命令中传递对象参数?

2024-02-26

我使用带有参数的新命令创建了 eclipse-rcp 项目的plugin.xml。

 ArrayList<parameterization> parameters = new ArrayList<parameterization>();
 IParameter iparam;

 //get the command from plugin.xml
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
 ICommandService cmdService =     (ICommandService)window.getService(ICommandService.class);
 Command cmd = cmdService.getCommand("org.ipiel.demo.commands.click");

//get the parameter
iparam = cmd.getParameter("org.ipiel.demo.commands.click.paramenter1");
Parameterization params = new Parameterization(iparam, "commandValue");
parameters.add(params);

//build the parameterized command
 ParameterizedCommand pc = new ParameterizedCommand(cmd, parameters.toArray(new       Parameterization[parameters.size()]));

//execute the command
 IHandlerService handlerService = (IHandlerService)window.getService(IHandlerService.class);
handlerService.executeCommand(pc, null);

我尝试了这个例子来传递参数并且它有效。

本示例中的问题是我只能传递 String 类型的参数。 (因为参数化)

我想传递哈希映射的参数,并且通常传递任何对象。

我试过这段代码

     IServiceLocator serviceLocator = PlatformUI.getWorkbench();
    ICommandService commandService = (ICommandService)      serviceLocator.getService(ICommandService.class);




    ExecutionEvent executionEvent = new ExecutionEvent(cmd, paramArray, null, null);
    cmd.executeWithChecks(executionEvent);

但它不起作用,参数没有移动(它为空)

您能帮忙将对象作为命令中的参数移动吗?


由于在我的第一个答案中添加另一个解决方案会让人感到困惑,因此我将为第二个解决方案提供另一个解决方案。 我给出的选择是“A)使用“执行事件”的选定对象(检查一下,它包含很多信息)。B)您可以使用 AbstractSourceProvider,这样您就可以将对象传递到应用程序上下文。”

如果您的对象是选择结构化对象(如树),则可以在您的处理程序中使用 A):

MyObject p = (MyObject) ((IStructuredSelection) HandlerUtil.getCurrentSelection(event)).getFirstElement();

B) 源提供者的使用有点棘手。主要思想是将对象添加到应用程序上下文中。阅读后我设置的一个项目中 Eclipse 3.x 的重要片段这个博客 http://splitshade.wordpress.com/2008/11/11/sourceproviders/(注意:它是德语,它提供的示例不起作用): 在你的plugin.xml中添加:

  <extension point="org.eclipse.ui.services">
  <sourceProvider
        provider="com.voo.example.sourceprovider.PersonSourceProvider">
     <variable
           name="com.voo.example.sourceprovider.currentPerson"
           priorityLevel="activePartId">
     </variable>
  </sourceProvider>

设置您自己的 SourceProvider。调用“getCurrentState”您可以获取变量(您的Person在本例中)该 SourceProvider 的对象:

public class PersonSourceProvider extends AbstractSourceProvider{

/** This is the variable that is used as reference to the SourceProvider
 */
public static final String PERSON_ID = "com.voo.example.sourceprovider.currentPerson";
private Person currentPerson;

public PersonSourceProvider() {

}

@Override
public void dispose() {
    currentPerson = null;
}

**/**
 * Used to get the Status of the source from the framework
 */
@Override
public Map<String, Person> getCurrentState() {
    Map<String, Person> personMap = new HashMap<String, Person>();
    personMap.put(PERSON_ID, currentPerson);
    return personMap;
}**

@Override
public String[] getProvidedSourceNames() {
    return new String[]{PERSON_ID};
}

public void personChanged(Person p){
    if (this.currentPerson != null && this.currentPerson.equals(p)){
        return;
    }

    this.currentPerson = p;
    fireSourceChanged(ISources.ACTIVE_PART_ID, PERSON_ID, this.currentPerson);
}

}

在您的视图中,您注册到 SourceProvider 并将对象设置为您想要传输到处理程序的对象。

public void createPartControl(Composite parent) {

    viewer = new TreeViewer(parent);
    viewer.setLabelProvider(new ViewLabelProvider());
    viewer.setContentProvider(new ViewContentProvider());
    viewer.setInput(rootPerson);
    getSite().setSelectionProvider(viewer);
    viewer.addSelectionChangedListener(new ISelectionChangedListener() {
        @Override
        public void selectionChanged(SelectionChangedEvent event) {
            Person p = null;
            if (event.getSelection() instanceof TreeSelection) {
                TreeSelection selection = (TreeSelection) event.getSelection();
                if (selection.getFirstElement() instanceof Person) {
                    p = (Person) selection.getFirstElement();
                }
            }
            if (p==null) {
                return;
            }
            IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
            ISourceProviderService service = (ISourceProviderService) window.getService(ISourceProviderService.class);
            PersonSourceProvider sourceProvider = (PersonSourceProvider) service.getSourceProvider(PersonSourceProvider.PERSON_ID);
            sourceProvider.personChanged(p);
        }
    });
}

在您的处理程序中,您只需调用 PersonSourceProvider#getCurrentState 即可取回您的对象。

这种方法的优点是,您可以在任何您想要的地方使用对象。例如。您甚至可以设置属性测试器来根据当前选定的对象启用/禁用 UI 元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在命令中传递对象参数? 的相关文章

随机推荐

  • XML 模式来验证 XML 模式?

    有谁知道是否可以使用另一个 XML 模式验证 XML 模式 如果是这样 是否有参考实现 我想使用 JAXB 解析架构文档 当然 大多数时候 您只需将浏览器指向用作 XML 文档命名空间的 URL 这也适用于 XML 模式 http www
  • 这段Java代码如何编译?

    一位同事遇到了一些看起来像这样的代码 但无法理解它如何编译 class FooClass public static void bar String arg System out println arg arg http www googl
  • Twitter Bootstrap:容器中的 div 高度为 100%

    使用 twitter bootstrap 2 我有一个带有导航栏的简单页面 并且在container我想添加一个 100 高度的 div 到屏幕底部 我的 css fu 生锈了 我无法解决这个问题 简单的 HTML div class na
  • Firebase Cloud Functions 上“尝试向 FCM 服务器进行身份验证时发生错误”

    我正在尝试通过创建 Firestore 文档 消息 时触发的 Firebase 云函数中的 FCM 向主题发送消息 订阅主题 也使用函数完成 并触发发送函数工作正常 但实际发送失败 并显示 Error An error occurred w
  • 如何修复错误::初始化字符串的格式不符合从索引 0 开始的规范::

    我在 godaddy 共享主机上上传了我的网站 我可以访问这个数据库来自我的管理工作室 我无法访问这个数据库来自我的网站 我收到以下错误 初始化字符串的格式不符合从索引 0 开始的规范 我的连接字符串位于网络配置它看起来像这样
  • 打开没有地址栏和标题的javascript弹出窗口,高度和宽度根据屏幕分辨率以百分比设置

    我想使用 javascript 打开没有标题和地址栏的弹出窗口 并且还想根据屏幕分辨率以百分比形式设置其高度和宽度 我怎样才能实现这一点 我做了这段代码 function popitup url LeftPosition screen wi
  • 当 jqgrid 中验证失败时突出显示错误单元格或输入

    我正在使用 jqgrid 内联编辑 并使用编辑规则在网格中进行验证 我想添加类来突出显示验证失败的输入的错误 例如 ui state error 我可以使用这个设置类来突出显示错误 jQuery grid id jqGrid setCell
  • 在 Lion 中获取 TFENode 的完整路径

    我正在尝试获取 OSX Lion 中 TFENode 的完整路径 但无法使用旧方法获取结果 通过转换为 FINode 并获取 fullPath 该方法 FINode nodeWithFENode myTFENode fullPath 似乎不
  • Jvm 崩溃:Java 运行时环境检测到致命错误

    我在实时服务器上发生了 Tomcat 崩溃 生成了 hs err pid 文件 其中有一个有问题的帧 gt wordcopy fwd dest aligned 0x54 我搜索了所有类似的 jvm 崩溃案例 但找不到这个有问题的框架的含义
  • 不支持的类版本错误

    当尝试从使用 Eclipse IDE 使用 jdk1 6 制作的客户端调用使用 NETbeans 使用 jdk1 7 制作的 EJB 时 我收到以下错误 Exception in thread main java lang Unsuppor
  • Oracle: ORA-01722: 无效数字

    我有一个查询 当我在 sqlplus 中运行它时效果很好 SQL gt SELECT T 0 ID AS ATTR 1 T 0 0 ID AS ATTR 2 CASE WHEN T 0 ID 1 AND T 0 0 ID 3 OR T 0
  • 从firebase客户端sdk获取user_pseudo_id?

    在 Firebase 分析中 user pseudo id自动登录bigquery 但是 我想在 firebase 客户端 sdk 例如 android ios sdk 中获取此值来指定用户 我在 firebase 的文档中找到了 但找不到
  • Paw 在外部浏览器中打开链接

    在开发端点时 我需要遵循相当复杂 繁琐的登录过程来向我们的网守进行身份验证 为此 我在 Paw 中打开开发人员登录页面 它在爪子内部打开并正确呈现内容 如果我单击按钮实际登录 则会打开外部浏览器 导致 Paw 无法跟踪正确的 cookie
  • 使用 strcmp 比较字符数组中的字符

    我已将 xml 文件读入 char 中 并尝试将该数组中的每个元素与某些字符 例如 进行比较 char 数组 test 只是一个包含一个元素的数组 包含要比较的字符 我必须这样做 否则 strcmp 方法会给我一个有关将 char 转换为
  • AzureML:“训练火柴盒推荐器”不起作用,并且没有描述错误

    我尝试使用该模块创建自己的实验 但未能成功 这是我得到的例外 错误 0018 用户 项目 评分三元组的训练数据集包含无效数据 关键 InputParameters DataTable Rows 14 Columns 3 estimatedS
  • 协议与自身的行为

    我最近在读Swift 中的协议 通用类型约束和数组 http letvargo mooo com protocols generic type constraints and arrays in swift 我的问题涉及博客中的以下两个示例
  • 线程安全,无易失性

    谁能解释为什么这个例子是线程安全的 没有易失性 http www cs umd edu pugh java memoryModel DoubleCheckedLocking html http www cs umd edu pugh jav
  • html5 相机输入可以在 Windows 10 平板电脑上使用吗?

    TL DR html5 相机输入可以在 Windows 10 平板电脑上使用吗 Details 设备 Dell Venue 8 Pro 平板电脑 操作系统 Windows 10 浏览器 Chrome Setup 使用以下 html 创建并托
  • 带参数的 before_filter

    我有一个方法可以执行以下操作 before filter authenticate rights only gt show def authenticate rights project Project find params id red
  • 如何在命令中传递对象参数?

    我使用带有参数的新命令创建了 eclipse rcp 项目的plugin xml ArrayList