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 ホバーは何もしません。Tree と Table にはメソッド 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 のテーブル 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);
    }
}); 
于 2012-10-12T14:35:22.373 に答える
2

このバグの別の回避策を見つけました。ウィンドウ (表) のサイズを変更するときに、表のセルで手動でワード ラップを行うため、表の行の高さを変更したいと考えていました。次の SWT シェルのリスナーでは、表のセルが適切に減少しました。

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 に答える