NatTable - 隐藏列的百分比大小调整
NatTable - Percentage Sizing with Column hiding
我想使用列百分比调整大小来强制 table 占据父级的宽度。
当我默认隐藏列时这不起作用,因为 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
以下是我在各种组合中尝试的一些不同的东西。 None 似乎在 table 动态填充数据后隐藏该列。
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));
}
});
}
目前没有解决方案。这样做的原因是列宽是在 DataLayer 中计算的。 ColumnHideShowLayer
位于它的顶部,只是隐藏列。它不会向 DataLayer
传达隐藏内容。
最终 ColumnHideShowLayer
需要根据隐藏状态重新触发百分比大小计算。但目前还没有 API。
如果您知道如何解决它,请随时创建增强工单并提供补丁。
我想使用列百分比调整大小来强制 table 占据父级的宽度。
当我默认隐藏列时这不起作用,因为 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
以下是我在各种组合中尝试的一些不同的东西。 None 似乎在 table 动态填充数据后隐藏该列。
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));
}
});
}
目前没有解决方案。这样做的原因是列宽是在 DataLayer 中计算的。 ColumnHideShowLayer
位于它的顶部,只是隐藏列。它不会向 DataLayer
传达隐藏内容。
最终 ColumnHideShowLayer
需要根据隐藏状态重新触发百分比大小计算。但目前还没有 API。
如果您知道如何解决它,请随时创建增强工单并提供补丁。