0

语境

我正在为 eclipse 3.4 及更多版本构建一个插件。我有一个带有 id 的视图,mrp.view其中 menuContribution 设置为toolbar:mrp.view. 这个 menuContribution 有一些命令,我​​有这个:

<handler
    class="mrp.handlers.export"
    commandId="mrp.commands.export">
</handler>

<command
    commandId="mrp.commands.export"
    label="My command"
    style="push">
</command>

我的处理程序mrp.handlers.export有一个动态 ìsEnabled()` 方法,如下所示:

@Override
public boolean isEnabled() {
    return !getMySelection().isEmpty();
}

问题

数据更改时如何刷新工具栏上的按钮?(如果我单击工具栏的另一个按钮,则会自动完成刷新,但如果我不...)

我试过了..

ICommandService service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
service.refreshElements("mrp.commands.export", null);

但它似乎没有做任何事情。

还有这个:

public class Export extends AbstractHandler implements PropertyChangeListener {

@Override
public void propertyChange(PropertyChangeEvent evt) {
    setBaseEnabled(!getSelection().isEmpty());
}

    // ....
}

它被调用,但我的视图菜单上的图标没有刷新(在 eclipse 3.7 上)。我做错什么了吗 ?

4

2 回答 2

1

当启用更改时,您的处理程序必须触发一个事件。如果您有更改使用org.eclipse.core.commands.AbstractHandler.setBaseEnabled(boolean)更新您的处理程序,它将触发所需的事件。

于 2013-06-18T12:57:30.910 回答
0

感谢保罗韦伯斯特的回答,我得到了它的工作。

public class Export extends AbstractHandler implements PropertyChangeListener {
    public Export() {
        Activator.getDefault().AddListener(this);
        setBaseEnabled(!getMySelection().isEmpty());
    }

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        // My handler
        return null;
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals(Activator.EVENT_SELECTION_CHANGED)) {
            boolean before = isEnabled();
            boolean after = !getMySelection().isEmpty();

            if (after != before) {
                setBaseEnabled(after);
            }
        }
    }
}
于 2013-06-20T07:01:51.707 回答