我有一个专栏'生命周期'在我的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");
}
});
答案 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");
}
}
});