【问题标题】:NatTable - Percentage Sizing with Column hidingNatTable - 具有列隐藏的百分比大小
【发布时间】:2016-11-23 00:32:19
【问题描述】:

我想使用列百分比大小来强制表格采用父级的宽度。

当我默认隐藏列时这不起作用,因为 setColumnPercentageSizing() 方法似乎没有排除隐藏的列并且没有正确计算宽度。

有没有一种简单的方法可以在我的代码中进行调整?

例子:

public void example(){
    createGlazedListsGridLayer();
    autoResizeColumns();
    nattable.configure();
}

public GlazedListsGridLayer createGlazedListsGridLayer(){
    SortedList<T> sortedList = new SortedList<>(eventList, null);
    this.bodyDataProvider = new ListDataProvider<>(sortedList, 
      columnPropertyAccessor);
    this.bodyDataLayer = new DataLayer(this.bodyDataProvider);
    ColumnHideShowLayer columnHideShowLayer = new
      ColumnHideShowLayer(bodyDataLayer);

    // In this example, hide the first column
    columnHideShowLayer.hideColumnPositions(Lists.newArrayList(0));
    this.bodyLayerStack = new DefaultBodyLayerStack(new 
      GlazedListsEventLayer<>(columnHideShowLayer, eventList));

    //...etc
}

protected void autoResizeColumns() {
    glazedListsGridLayer.getBodyDataLayer().setColumnPercentageSizing(true);
    nattable.addConfiguration(new DefaultNatTableStyleConfiguration() {
        {
            cellPainter = new LineBorderDecorator(new TextPainter(false, 
              true, 5, true));
        }
    });
}

更新

这并不理想,但这是我能做到的最接近的地方

public void adjustColumnWidth() {
    getBodyDataLayer().setColumnPercentageSizing(false);
    // Avoid the first column since it's hidden
    for (int x = 1; x <= numColumns; x++) {
        getBodyDataLayer().setColumnWidthByPosition(x,
                getParent().getSize().x / numColumns, true);
    }
}

更新 2

以下是我尝试过的几种不同组合。在用数据动态填充表格后,它们似乎都没有隐藏列。

protected void enableAutoResizeColumns() {
    getBodyDataLayer().setColumnPercentageSizing(true);
    getBodyDataLayer().setDefaultColumnWidthByPosition(0, 0);
    getBodyDataLayer().setColumnWidthByPosition(0, 0);
    getBodyDataLayer().setColumnWidthPercentageByPosition(0, 0);
    getNatTable().addConfiguration(new 
       DefaultNatTableStyleConfiguration() {
        {
            cellPainter = new LineBorderDecorator(new TextPainter
              (false, true, 5, true));
        }
    });
}

【问题讨论】:

    标签: java nattable


    【解决方案1】:

    目前没有解决方案。原因是列宽是在 DataLayer 中计算的。 ColumnHideShowLayer 位于其顶部并简单地隐藏列。它不会向DataLayer 传达隐藏某些内容的信息。

    最后ColumnHideShowLayer 需要根据隐藏状态重新触发百分比大小计算。但目前还没有 API。

    如果您知道如何解决它,请随时创建增强票证并提供补丁。

    【讨论】:

    • 感谢您的信息。我不得不做一个上面发布的解决方法。不完全理想,但现在已经足够接近了,因为不支持该功能
    • 问题是,您是否需要静态隐藏列,或者用户是否应该能够隐藏和显示列。后者不支持ATM。如果您想以编程方式静态隐藏列,为什么要使用列隐藏/显示功能而不是简单地将列的宽度设置为 0?您的解决方法有一个缺点,即在调整窗口大小时,列不会根据父复合大小调整大小。
    • 使用动态行进行静态隐藏。如果我明确地将所需的列宽设置为零,它会暂时起作用。一旦动态行进入,隐藏的列就会显示出来。
    • 这没有意义。为什么显示行后列宽会改变?
    • 这是个好问题 :)。我不知道它为什么这样做。我的猜测是它在内部以某种方式重新计算宽度
    猜你喜欢
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多