2011-05-26 18 views
0


ツリーの列の一部に(テーブルのように見える)列を塗りつぶしています。 Windowsシステムではうまく見えますが、Linux/Macでは背景色(白、青、白、青など)を交互に使用しているためそうではありません。
ツリーの背景色を交互に削除したいと思います。それが可能ならどんなアイデア?私はこれらのシステムでtree.setLinesVisible(true)を禁止しようとしましたが、必要な縦線も描画しません。SWT Tree with columns:Linux/Mac上の行の背景色を交互に削除する

答えて

0

オーナードローを使用してこれを行うことができると思います。出発点としてthis snippetを使用し、これにEraseItemイベントハンドラを交換:

public void handleEvent(Event event) { 
    event.detail &= ~SWT.HOT; 
    GC gc = event.gc; 
    Rectangle area = table.getClientArea(); 
    /* 
    * If you wish to paint the selection beyond the end of 
    * last column, you must change the clipping region. 
    */ 
    int columnCount = table.getColumnCount(); 
    if (event.index == columnCount - 1 || columnCount == 0) { 
     int width = area.x + area.width - event.x; 
     if (width > 0) { 
     Region region = new Region(); 
     gc.getClipping(region); 
     region.add(event.x, event.y, width, event.height); 
     gc.setClipping(region); 
     region.dispose(); 
     } 
    } 
    gc.setAdvanced(true); 
    if (gc.getAdvanced()) gc.setAlpha(127); 
    Rectangle rect = event.getBounds(); 
    Color background = gc.getBackground(); 
    gc.setBackground(display.getSystemColor(SWT.COLOR_RED)); 
    gc.fillRectangle(0, rect.y, 500, rect.height); 
    // restore colors for subsequent drawing 
    gc.setBackground(background); 
} 

は(LinuxのウィンドウマネージャのSWTが使用されている)とTreesで、しかし、それを試していないGTKで動作するはずです。

所有者ドローは、私は強くGTKのため、このようなイベントハンドラを追加することをお勧め高価であるため:

if(SWT.getPlatform().equals("gtk")){ ... } 

しかし、SWTの全体のポイントは、ネイティブの描画を持っています。これにより、ユーザーは自宅で感じるため、ソフトウェアのユーザーの受け入れが向上します。たぶん、あなたはGTKユーザーのための交互の背景を取り除く必要がない方法を設計することができます。

+0

これは正確ですが、Mac OS Carbon(特にCocoaで試したことがない)でオーナーの描画をしている落とし穴があることに注意してください。特に、テーブルのスクロールを開始するとペイントイベントが失われます。私は(期待される)ネイティブの行動を維持することに+1します。 –

関連する問題