2008-08-29 12 views
12

どうしたのですか?SWT ScrolledCompositeが子供の一部を食べ​​ないようにする

public void createPartControl(Composite parent) { 
    parent.setLayout(new FillLayout()); 
    ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL); 
    scrollBox.setExpandHorizontal(true); 
    mParent = new Composite(scrollBox, SWT.NONE); 
    scrollBox.setContent(mParent); 
    FormLayout layout = new FormLayout(); 
    mParent.setLayout(layout); 
    // Adds a bunch of controls here 
    mParent.layout(); 
    mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true)); 
} 

...しかし、それは、クリップの最後のボタン:ここ

は私のコードからの抜粋です alt text

bigbrother82:動作しませんでした。

SCdF:あなたの提案を試みましたが、スクロールバーが消えました。私はそれについてもう少し働かせる必要があります。

+0

ちょっとジェレミー、私の提案はうまくいきませんでした。これで運がありましたか? – SCdF

+0

(btw、私の答えにコメントすると、それは私の返事に表示され、それを見逃すことはありません) – SCdF

答えて

12

これはScrolledCompositeを使用するときの一般的なハードルです。スクロールバーを表示する必要があるほど小さくなったら、スクロールバーのスペースを確保するために、クライアントコントロールを水平方向に縮小する必要があります。これには、次のコントロールをさらに下に移動するラベルラップラインを作成するという副作用があり、コンテンツコンポジットに必要な最小の高さが増加しました。

コンテンツコンポジット(mParent)の幅の変更をリッスンし、新しいコンテンツの幅を指定して最小高さを再度計算し、新しい高さのスクロールしたコンポジットでsetMinHeight()を呼び出す必要があります。

public void createPartControl(Composite parent) { 
    parent.setLayout(new FillLayout()); 
    ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL); 
    scrollBox.setExpandHorizontal(true); 
    scrollBox.setExpandVertical(true); 

    // Using 0 here ensures the horizontal scroll bar will never appear. If 
    // you want the horizontal bar to appear at some threshold (say 100 
    // pixels) then send that value instead. 
    scrollBox.setMinWidth(0); 

    mParent = new Composite(scrollBox, SWT.NONE); 

    FormLayout layout = new FormLayout(); 
    mParent.setLayout(layout); 

    // Adds a bunch of controls here 

    mParent.addListener(SWT.Resize, new Listener() { 
    int width = -1; 
    public void handleEvent(Event e) { 
     int newWidth = mParent.getSize().x; 
     if (newWidth != width) { 
     scrollBox.setMinHeight(mParent.computeSize(newWidth, SWT.DEFAULT).y); 
     width = newWidth; 
     } 
    } 
    } 

    // Wait until here to set content pane. This way the resize listener will 
    // fire when the scrolled composite first resizes mParent, which in turn 
    // computes the minimum height and calls setMinHeight() 
    scrollBox.setContent(mParent); 
} 

サイズ変更をリッスンする際には、幅が同じであるサイズ変更イベントは無視されます。これは、幅が同じであれば、コンテンツの高さの変化がのコンテンツの高さに影響しないためです。

+0

ありがとう、これは問題を解決しました。 – Jeremy

0

レイアウト後にscrollBoxのサイズを再計算する必要はありませんか?

2

私は間違っていないよ場合は、あなたが持っているように、

mParent.layout(); 

mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true)); 

を交換する必要があります。

public void createPartControl(Composite parent) { 
    parent.setLayout(new FillLayout()); 
    ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL); 
    scrollBox.setExpandHorizontal(true); 
    mParent = new Composite(scrollBox, SWT.NONE); 
    scrollBox.setContent(mParent); 
    FormLayout layout = new FormLayout(); 
    mParent.setLayout(layout); 
    // Adds a bunch of controls here 
    mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true)); 
    mParent.layout(); 
} 
0

に.setMinWidthと.setMinHeightを設定してみてくださいレイアウトが完了したら、ScrolledCompositeを呼び出して、メインコンポジットのサイズを渡します。

関連する問題