2012-02-27 9 views
2

テーブル/ツリーの行にカスタム高さを設定する必要があります。 SWT.MeasureItemイベントをリッスンすることは、テーブルに項目があるときに機能しますが、空のテーブルがあると機能しません。 アイデア ありがとうございます。SWT空のテーブル/ツリーのカスタム行の高さ

viewer.getTree().addListener(SWT.MeasureItem, new Listener() { 
    public void handleEvent(Event event) { 
     event.height = 30; 
    } 
    }); 

答えて

2

あなたはテーブル行に、またはテーブル自体に高さを設定しようとしていますか?

テーブル行の高さを設定しようとすると、測定する項目がない限りSWT.MeasureItemイベントが発生しないため、空のテーブルに対しては起動されません。 (少し疑わしいと思われる)Eclipse bug 134454を参照してください。

内部的には、にはsetItemHeight(int)がありますが、パッケージに保護されているため、リフレクションを使用してアクセスする必要があります。 Reflectionは、特にJavaランタイムの複数のバージョン、または複数のバージョンのSWT(新しいメソッドが追加されるか古いメソッドが削除される)をサポートする必要がある場合に、非常に便利な高度な言語機能です。クラス、メソッド、フィールドなどの可用性を動的に照会し、存在する場合にのみ呼び出すことができます。さらに、通常は呼び出し元に保護されているメソッドやフィールドにアクセスできます。 Reflectionを頻繁に使用することはお勧めしませんが、他の選択肢がないときにはやり直してください。

This other stackoverflow questionは、一般的にプライベートメソッドを呼び出す方法を説明するのに良い仕事をしていませんが、ここではsetItemHeightメソッドのメソッドシグネチャを取得し、それを呼び出すの具体的な例を示します

final Table table = new Table(parent, SWT.BORDER); 

/* Set up table columns, etc. */ 

table.pack(); 

try 
{ 
    /* 
    * Locate the method setItemHeight(int). Note that if you do not 
    * have access to the method, you must use getDeclaredMethod(). If 
    * setItemHeight(int) were public, you could simply call 
    * getDeclaredMethod. 
    */ 
    Method setItemHeightMethod = 
     table.getClass().getDeclaredMethod("setItemHeight", int.class); 

    /* 
    * Set the method as accessible. Again, this would not be necessary 
    * if setItemHeight(int) were public. 
    */ 
    setItemHeightMethod.setAccessible(true); 

    /* 
    * Invoke the method. Equivalent to table.setItemHeight(50). 
    */ 
    setItemHeightMethod.invoke(table, 50); 
} 
catch (Exception e) 
{ 
    /* 
    * Reflection failed, it's probably best to swallow the exception and 
    * degrade gracefully, as if we never called setItemHeight. Maybe 
    * log the error or print the exception to stderr? 
    */ 
    e.printStackTrace(); 
} 

しかし、あなたがしている場合実際にはテーブル自体の高さをに設定しようとしていますが、レイアウトを使用する方がよいでしょう。たとえば、GridLayoutの場合はGridData.heightHintと設定します。

+0

こんにちは、私は十分ではなかった、私はテーブルの行の高さを設定しようとしています。私はテーブルのためのダミー入力を使用して、回避策として空に入力をリセットすることができると思っていたが、私は本当に私はより洗練されたソリューションを見つけることができることを願っています。 – Lori

+0

私は参照してください。私はいくつかの入力を追加する(削除する)行の高さを保持すると思いますが、私はそれがちらつきを持っている可能性がありますメジャーアイテムのリスナーを呼び出すためにペイントが必要になると思う。私はあなたのラベルデコレータが空の文字列を返す場合は、それを最小限に抑えるだろうと思うが、それでもまだ最適ではない解決策のように思える。あなたは 'Table.setItemHeight(int)'を呼び出すためにリフレクションを開いていますか? (それが多かれ少なかれハッキングであるかどうかは分かりません) –

+0

申し訳ありませんが、前に反射を使用したことがないので、あなたが何を意味するのか分かりません。 – Lori

0

私はColumnLabelProviderの方法getImageで提供された画像を含むテーブルで同じ問題を抱えていました。私はより高い行が欲しかった。 私は、使用する画像の最大高さがテーブルの行の高さを設定していることに気づいたので、非常に馬鹿だが効果的な回避策は、より高い画像を使用して透明な領域を追加することでした。

関連する問題