根据条件在nattable中添加颜色到行

时间:2018-01-17 04:31:17

标签: java nattable

我有一个专栏'生命周期'在我的NAT表中,我必须为每一行设置相应的颜色。 为行添加颜色很好。问题是当我使用滚动条向左或向右滚动时,颜色消失。我不知道我错过了什么。如果你对如何解决它有任何想法,请帮助我

我的代码如下:

IConfigLabelAccumulator cellLabelAccumulator = new IConfigLabelAccumulator(){

  @Override
  public void accumulateConfigLabels(final LabelStack configLabels, final int columnPosition,
      final int rowPosition) {

    Object dataValueByPosition = PhysicalDimensionNatTable.this.bodyLayer.getDataValueByPosition(10, rowPosition);

    if ((dataValueByPosition != null) && dataValueByPosition.equals("Valid")) {
      configLabels.addLabel("VALID");
    }
    if ((dataValueByPosition != null) && dataValueByPosition.equals("Invalid")) {
      configLabels.addLabel("INVALID");
    }
    if ((dataValueByPosition != null) && dataValueByPosition.equals("Obsolete")) {
      configLabels.addLabel("OBSOLETE");
    }
  }
};
this.bodyLayer.setConfigLabelAccumulator(cellLabelAccumulator);

this.natTable.addConfiguration(new AbstractRegistryConfiguration(){

  @Override
  public void configureRegistry(final IConfigRegistry configRegistry) {
    Style cellStyle = new Style();
    cellStyle.setAttributeValue(CellStyleAttributes.BACKGROUND_COLOR, GUIHelper.COLOR_GREEN);
    configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, cellStyle, DisplayMode.NORMAL, "VALID");

    cellStyle = new Style();
    cellStyle.setAttributeValue(CellStyleAttributes.BACKGROUND_COLOR, GUIHelper.COLOR_RED);
    configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, cellStyle, DisplayMode.NORMAL,
        "INVALID");

    cellStyle = new Style();
    cellStyle.setAttributeValue(CellStyleAttributes.BACKGROUND_COLOR, GUIHelper.COLOR_YELLOW);
    configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, cellStyle, DisplayMode.NORMAL,
        "OBSOLETE");
  }
});

1 个答案:

答案 0 :(得分:0)

您面临的问题是IConfigLabelAccumulator已在bodyLayer上注册,我认为这是最顶层为ViewportLayer的堆栈。 bodyLayer.getDataValueByPosition(10, rowPosition);返回列位置10的数据值。并且基础单元格在滚动时更改,例如,如果第一列移出可见范围,则具有索引11的列将成为位置10处的列。这就是索引位置转换,它是NatTable中的基本概念。

您需要执行转换计算,例如通过LayerUtil来获取索引,或直接在身体的DataLayer上操作,而不是使用bodylayer堆栈。那么您不需要考虑索引位置转换。我通常建议使用后者。

由于索引位置转换处理对于几个人而言过于抽象,另一个选择是对DataLayer上的对象进行操作。为此,IConfigLabelAccumulator需要知道IRowDataProvider能够访问行对象。然后在DataLayer上注册。

示例看起来像以下代码段。当然,它应该转移到你的解决方案,更好的分类。

    IRowDataProvider<PersonWithAddress> bodyDataProvider = new ListDataProvider<>(data, accessor);
    DataLayer bodyDataLayer = new DataLayer(bodyDataProvider);

    bodyDataLayer.setConfigLabelAccumulator(new IConfigLabelAccumulator() {

        @Override
        public void accumulateConfigLabels(LabelStack configLabels, int columnPosition, int rowPosition) {
            PersonWithAddress person = bodyDataProvider.getRowObject(rowPosition);
            if ("Simpson".equals(person.getLastName())) {
                configLabels.addLabel("YELLOW");
            }
        }
    });