2

我有一棵树,其中填充了可能有图像的 TreeItems(带有缩略图的行)。我用 MeasureItem 监听器调整了行高,一切都很好。

但是,现在我想让这种变化动态化。我检查一行是否应该有图像,如果当前列出的行中的任何行有应该显示的图像,我将行高设置为 180px,并且所有行都具有该高度。如果没有包含图像的行,则行高应为 25px。

问题是,如果在任何时候将行高设置为 180 像素,我都无法将其更改回 25 像素。我的代码看起来像这样(简化):

//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(). 也许我应该处置并重新创建表/树(我不想这样做)?

那么,知道该怎么做吗?

PS 不要混淆,我不需要行的各种高度,我知道在 Windows/Mac 下这是不可能的。我只需要一种重置高度的方法。

4

4 回答 4

4

树和表的问题相同。setFont 悬停什么也不做。树和表有方法 setItemHeight(int itemHeigh) 通过反射你可以调用这个方法(见https://bugs.eclipse.org/bugs/attachment.cgi?id=220735

对于表列,您可以在调整大小的单元格上添加侦听器并通过反射调用此方法(由链接描述):

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 的表监听器中,您可以为单元格设置必要的高度:

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);
    }
}); 
于 2012-10-12T14:35:22.373 回答
2

我为这个错误找到了另一种解决方法。当您调整窗口(表格)的大小时,我想调整表格行的高度,因为表格单元格中的手动换行。使用 SWT shell 的以下侦听器,表格单元格适当地减少了。

shell.addListener(SWT.Resize, new Listener() {
    @Override
    public void handleEvent(Event event) {
        table.setFont(table.getFont());
    }
});
于 2012-07-06T11:03:35.443 回答
1

您不能降低行高的事实是一个已知的错误

于 2012-04-05T14:04:20.137 回答
-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);
于 2012-06-08T15:22:55.283 回答