2011-10-19 10 views
1

をレイアウト:
enter image description here:私はRowLayoutを持つ親の複合でそれを使用しようと日食RCP:私は、カスタムウィジェットを記述しようとしていますカスタム化合物ウィジェット

package amarsoft.rcp.base.widgets; 

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.ControlAdapter; 
import org.eclipse.swt.events.ControlEvent; 
import org.eclipse.swt.graphics.Point; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.swt.widgets.Layout; 
import org.eclipse.swt.widgets.Text; 
import org.eclipse.wb.swt.ResourceManager; 

public class SearchBox extends Composite { 

    private Text text; 

    private Label icon; 

    public SearchBox(Composite parent) { 
     super(parent, SWT.BORDER); 
     setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); 
     setBackgroundMode(SWT.INHERIT_FORCE); 

     icon = new Label(this, SWT.NONE); 
     icon.setImage(ResourceManager.getImage("icons/search.png")); 

     text = new Text(this, SWT.NONE); 
     addControlListener(new ControlAdapter() { 
      @Override 
      public void controlResized(ControlEvent e) { 
       resize(); 
      } 

     }); 
    } 

    void resize() { 
     Point iExtent = icon.computeSize(SWT.DEFAULT, SWT.DEFAULT, false); 
     Point tExtent = text.computeSize(SWT.DEFAULT, SWT.DEFAULT, false); 
     icon.setBounds(tExtent.x, 1, iExtent.x, iExtent.y); 
     text.setBounds(1, 1, tExtent.x, tExtent.y); 
    } 

    @Override 
    public Point computeSize(int wHint, int hHint, boolean changed) { 
     Point iExtent = icon.computeSize(SWT.DEFAULT, SWT.DEFAULT, false); 
     Point tExtent = text.computeSize(SWT.DEFAULT, SWT.DEFAULT, false); 
     System.out.println(iExtent); 
     System.out.println(tExtent); 
     int width = iExtent.x + tExtent.x; 
     int height = Math.max(iExtent.y, tExtent.y); 
     if (wHint != SWT.DEFAULT) 
      width = wHint; 
     if (hHint != SWT.DEFAULT) 
      height = hHint; 
     System.out.println(new Point(width + 2, height + 2)); 
     return new Point(width + 5, height + 5); 
    } 

} 

を、それはこのようになります

が、私はFillLayoutを持つ親の複合でそれを使用しようとすると、それは次のようになります。 enter image description here

は、どのように私はこのようなことが常に動作することができます: は、常に一定の高さ、最小の幅を持ち、それ以上のスペースがあれば水平方向にサイズ変更することができます。

+0

私は確かにSWT.Search | SWT.ICON_SEARCHはウィンドウでは機能しません。だから私は1つ書くことを試みる。 – CaiNiaoCoder

答えて

0

親コンポジットは、子に任意のサイズを与えることができます。単一の子供の場合、FillLayoutは、すべての利用可能なスペースを消費するように子供のサイズを変更します。それはちょうどそれがどのように動作し、どのように動作するはずです。

子供を適切な方法でレイアウトするのは、親コンポジットの責任です。つまり、FillLayoutはここで使用するレイアウトが間違っています。通常のTextコントロールで試してみてください。 FillLayoutは、1行のテキストの場合よりもはるかに高くなります。

+0

「子供を適切な方法でレイアウトするのは親コンポジットの責任です」---私はそれを得ました! – CaiNiaoCoder

+0

他のレイアウトとは異なり、FillLayoutは子ウィジェットを呼び出すのではありません。 "computeSize"メソッド – CaiNiaoCoder

関連する問題