我有一个Tree,其中填充了可能有图像的TreeItems(带缩略图的行)。我用MeasureItem监听器调整行高,然后一切都很好。
但是,现在我想让这种变化变得动态。我检查一行是否应该有一个图像,如果当前列出的行中的任何一行有一个应该显示的图像,我将行高设置为180px,所有行都有该高度。如果没有带图像的行,则行高应为25px。
问题是,如果在任何时候行高设置为180px,我无法将其更改回25px。 我的代码看起来像这样(简化):
//this check is run on each page of paginated results fetched from DB
rowHeight=25;
for(Result r : results){
if(r.hasImage()){
rowHeight=180;
break;
}
}
// resize the row height using a MeasureItem listener
tree.addListener(SWT.MeasureItem, new Listener() {
public void handleEvent(Event event) {
event.height = rowHeight;
}
});
//added 'event.height=rowHeight' here just to check if it will draw as I want
tree.addListener(SWT.EraseItem, new Listener() {
public void handleEvent(Event event) {
if(event.index!=ColumnType.SCREENSHOT.toIndexNum()){
event.detail &= ~SWT.FOREGROUND;
}
event.height=rowHeight;
}
});
rowHeight变量设置为它应该,并且MeasureListener中的'event.height'也设置为相同的值。但仍然不想降低身高。在结果的每一页上,我都会使用tree.removeAll()
清除项目。也许我应该处理并重新创建表/树(我不想这样做)?
那么,知道怎么做吗?
P.S。 不要混淆,我不需要在行上有各种高度,我知道在Windows / Mac下不可能。我只需要一种方法来重置高度。
答案 0 :(得分:4)
Tree和Table的问题相同。 setFont hovever什么都不做。 树和表有方法setItemHeight(int itemHeigh) 通过反射,您可以调用此方法(请参阅https://bugs.eclipse.org/bugs/attachment.cgi?id=220735)
对于表colum,您可以在resize单元格上添加侦听器并通过反射调用此方法(由链接描述):
TableColumn column = new TableColumn(table, SWT.CENTER, i);
column.addListener(SWT.Resize, new Listener() {
@Override
public void handleEvent(Event event) {
int min = 10;
setItemHeight(table, min);
}
});
min - 是单元格高度的最小值;
之后在事件SWT.MeasureItem的表Listener中,您可以为您的单元格设置必要的高度:
table.addListener(SWT.MeasureItem, new Listener() {
public void handleEvent(Event event) {
TableItem item = (TableItem)event.item;
String text = item.getText(event.index);
Point size = event.gc.textExtent(text);
event.height = Math.max(event.height, size.y);
}
});
答案 1 :(得分:2)
我发现了这个bug的另一种解决方法。 我想调整表格行的高度,当你调整窗口(表格)的大小时,因为在表格单元格中手动换行。 通过以下SWT shell监听器,表格单元格正确地减少了。
shell.addListener(SWT.Resize, new Listener() {
@Override
public void handleEvent(Event event) {
table.setFont(table.getFont());
}
});
答案 2 :(得分:1)
您无法降低行高的事实是known bug。
答案 3 :(得分:-5)
http://www.exampledepot.com/egs/javax.swing.tree/RowHeight.html
非常适合动态行高。
// Create tree
JTree tree = new JTree();
// All rows will be given 15 pixels of height
tree.setRowHeight(15);
// Have the row height for each row computed individually
tree.setRowHeight(0);
// If the row height is 0 and the height of a row has dynamically changed, it is necessary
// to flush the internal cache of row heights. The following calls flush the internal cache.
if (tree.getRowHeight() <= 0) {
// Temporary change to non-zero height
tree.setRowHeight(1);
}
tree.setRowHeight(0);