在Eclipse E4中设置固定的零件尺寸

时间:2016-02-10 19:53:09

标签: java eclipse eclipse-rcp e4

我有一个应用程序,我正在e4中构建,但我很难将几个部分固定大小。我有一个PartSashContainer,其中包含两个Parts和另一个PartSashContainer。我最初在containerData参数中设置了大小,但这些值是相对的,并且仍允许重新调整部件的大小。我想确保这些部件是固定的高度,不能重新调整大小。有这么简单的方法吗?

List view from Application.e4xmi

3 个答案:

答案 0 :(得分:0)

Eclipse bug 361731是对此功能的请求。目前尚未实施。

可以使用自定义渲染器,但这很难。

答案 1 :(得分:0)

我不确定这是否在Neon之前可用,但是Eclipse Neon允许你添加" NoMove"作为Part Sash Container的标记,您想锁定而不是调整大小。

答案 2 :(得分:0)


我有一个非常相似的任务,几次偶然发现了您的问题。我需要按照带有固定大小的应用程序标头和固定大小的页脚的企业设计来实现RCP应用程序。我找不到完美的方法,但是vogella tutorial on custom renderers给了我一些提示。我仍然必须重复一些代码,但找不到聪明的方法。

我的要求:

  • 应用程序标题位于顶部,具有固定高度,上方没有控件 标头
  • 顶部固定大小的应用程序标题,标题上方没有控件
  • 应用程序页脚位于底部,再次具有固定高度

所以我所做的是:

  • 删除第一部分上方的所有内容(主菜单, 工具栏...)
  • 使用1个零件(页眉),需要的2个控件(内容),3个最后零件(页脚)创建零件窗扇容器
  • 在此部件框格容器中执行以下操作:
    1. 在“标签”中添加“ fx_fixedLayout”(因为我不想调整腰带的大小)
    2. 将“ CUSTOM_RENDERER_UI = my.renderer.MainSashRenderer”添加到“永久” 状态”
  • 创建一个副本 并命名为“ org.eclipse.e4.ui.workbench.renderers.swt.SashLayout” “ my.renderer.MainSashLayout”。更改方法“ tileSubNodes”并设置 第一个和最后一个孩子的固定高度。
  • 扩展类“ SashRenderer”,并将其命名为“ MainSashRenderer”
  • 创建一个新的“ MainWorkbenchRendererFactory”扩展 “ WorkbenchRendererFactory”,将新的渲染器挂入。此类 仅将“ MainSashRenderer”附加到“ MPartSashContainer”对象 具有特定ID(因为我希望所有其他框格保持不变)。

public class MainWorkbenchRendererFactory extends WorkbenchRendererFactory {

    private final static String MAIN_SASH_ID = "myapp.partsashcontainer.main";

    @Override
    public AbstractPartRenderer getRenderer(MUIElement uiElement, Object parent) {
        if (uiElement instanceof MPartSashContainer
        && MAIN_SASH_ID.equalsIgnoreCase(((MPartSashContainer)uiElement).getElementId())) {
            MainSashRenderer renderer = new MainSashRenderer();
            super.initRenderer(renderer);
            return renderer;
        }
        return super.getRenderer(uiElement, parent);
    }
}

在“ MainSashRenderer”类中,将引用从“ SashLayout”更改为“ MainSashLayout”。

在“ MainSashLayout”类中,方法tileSubNodes:

    // subsctract size for header and footer:
    availableSpace -= (this.footerHeightPx + this.headerHeightPx);

    // Subtract off the room for the sashes
    availableSpace -= ((childCount - 1) * sashWidth);

    if (availableSpace < 0)
    availableSpace = 0;

    for (MUIElement subNode : visibleChildren) {

    if (childNum == 0) {
        newSize = this.headerHeightPx;
    } else if (childNum == visibleChildren.size()-1) {
        newSize = this.footerHeightPx;
    } else {
        // Calc the new size as a %'age of the total
        double ratio = getWeight(subNode) / totalWeight;
        newSize = (int) ((availableSpace * ratio) + 0.5);
    }
...

具有不同窗口大小的结果(页眉和页脚保持其像素高度): Screenshots with different window sizes