Java 为什么在Eclipse3.2插件中添加项目会弄乱工具栏?

Java 为什么在Eclipse3.2插件中添加项目会弄乱工具栏?,java,eclipse-plugin,eclipse-rcp,jface,Java,Eclipse Plugin,Eclipse Rcp,Jface,我正在进行一项增强,为Eclipse插件的工具栏添加按钮。这项技术相当陈旧。我正在使用IBMRationalApplicationDeveloper7.0.10。以下是我所看到的版本 JDK 1.5 Eclipse Platform 3.2.2 Eclipse Plugin Development 3.2.1 Eclipse RCP 3.2.2 当我的代码向工具栏添加一个新按钮时,它会弄乱工具栏。它只显示部分按钮,隐藏其余按钮。但是当我调整视图的大小时,即使是最微小的一点,所有的按钮都会显示出

我正在进行一项增强,为Eclipse插件的工具栏添加按钮。这项技术相当陈旧。我正在使用IBMRationalApplicationDeveloper7.0.10。以下是我所看到的版本

JDK 1.5
Eclipse Platform 3.2.2
Eclipse Plugin Development 3.2.1
Eclipse RCP 3.2.2
当我的代码向工具栏添加一个新按钮时,它会弄乱工具栏。它只显示部分按钮,隐藏其余按钮。但是当我调整视图的大小时,即使是最微小的一点,所有的按钮都会显示出来。这似乎不是一个屏幕不动产的例子,因为放大视图并没有帮助。我是Eclipse插件开发的新手,所以我不确定是什么导致了这种情况。我似乎正在做需要添加按钮的事情。我尝试过不同的方法,比如用insertBefore代替add等等。但似乎没有任何帮助

我使用Eclipse附带的示例插件编写了一些测试代码来隔离这个问题,但没有成功。我已经给出了两个类的代码

// This class is generated from Elipse, to which I have added code
public class MenuBarTestView extends ViewPart {

    // Instance variables ...

   public void createPartControl(Composite parent) {
       viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
       drillDownAdapter = new DrillDownAdapter(viewer);
       viewer.setContentProvider(new ViewContentProvider());
       viewer.setLabelProvider(new ViewLabelProvider());
       viewer.setSorter(new NameSorter());
       viewer.setInput(getViewSite());

       // Selection change listener, which adds a button to tool bar
       // I added the following line
       viewer.addSelectionChangedListener(new TreeSelectionChangedListener(this));

       makeActions();
       hookContextMenu();
       hookDoubleClickAction();
       contributeToActionBars();
   }

   .
   .  // Other Eclipse generated code for the sample plugin goes here
   .
   .

   // I added this method to add a button
   public void addButton () {

       IActionBars bars = getViewSite().getActionBars();
       IToolBarManager tbm = bars.getToolBarManager();

       Action action = new Action() {
          public void run() {
              showMessage("Action 1 executed");
          }
      };
      action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
            getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER));
      tbm.add(action);
      tbm.update(false);

   }
}
我为选择更改事件编写了以下类

package menubartest.views;

import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;

public class TreeSelectionChangedListener implements ISelectionChangedListener {

    private MenuBarTestView view;

    public TreeSelectionChangedListener(MenuBarTestView view) {
        super();
        this.view = view;
    }

    public void selectionChanged(SelectionChangedEvent event) {
        // TODO Auto-generated method stub
        view.addButton();
    }
}
当应用程序启动时

这取决于树上的选择

这是一次非常轻微的调整之后


有人能帮忙吗?

看起来您需要在添加到工具栏后调用iactionbar.updateActionBars方法。

这似乎是Eclipse 3.2或至少是与RAD 7.0捆绑的版本的一个bug。我在Eclipse3.7中尝试了这一点,但没有发现问题。

我用addButton方法中的bar.updateActionBars替换了tbm.update,但没有任何帮助。我还尝试在bars.updateActionBars之后调用tbm.update。这也无济于事。查看Eclipse源代码,我真的找不到任何与此类似的地方-通常所有按钮都在视图初始化期间添加到工具栏,并根据需要启用/禁用。这可能是真的。我需要添加/删除按钮。我已经为此挣扎了一段时间。如果我删除所有按钮removeAll,在ToolBarManager上执行更新,然后重新添加按钮,然后在ToolBarManager上执行另一次更新,那么它就可以工作了。但是,这会使工具栏刷新,并且非常明显。