2009-06-07 22 views
5

Uygulamalarımdan biri için SWT kullanarak bir Master-Detail düzeni oluşturmak istiyorum.SWT: ScrolledComposite ile İç içe Layout Layout kullanılabilir alanı aşıyor

Kapsayıcı, İçerik, Kenar Çubuğu ve Bölüm 1, Kompozit örnekleridir. Yatay tüm alanı kapmak gerekir

+--Container-------------------------------------+ 
|+--Content----------------------++--Sidebar----+| 
||        ||+--Part1----+|| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        ||+-----------+|| 
||        ||+--Scrolled-+|| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        ||+-----------+|| 
|+-------------------------------++-------------+| 
+------------------------------------------------+ 

İçerik ve dikey kullanıma hazır: kaydırılan bir ScrolledComposite

istenen düzen gibi bir şey olmasıdır.

Kenar çubuğu temel olarak Part1 ve Scrolled için eşit yükseklikte olması gereken bir kaptır.

Kaydırılan, içerik bileşiminde düzenlenmiş bir dinamik alt öğe sayısı içeren bir Kompozit konteynırdır. Alt öğe sayısının büyük bir varyasyonu olabileceğinden, bu Bileşenin kaydırılabilir olması gerekir.

Ben şimdi şu şekilde bu hayata geçirdik:

  • Konteyner 2 yay²labilir bir GridLayout vardır. İçerisinde, içeriğin FILL_BOTH davranışı vardır ve ayrıca tüm YATAY/DÜSEY alanı alır.

  • Kenar çubuğunda bir FillLayout (SWT.VERTICAL) vardır ve Part1 ve Scrolled Childs'ı içerir.

Sorun: kaydırılan kompozit içine öğeleri bir sürü koyarak ve düzen sadece kullanılabilir alanı taşıyor ve olması gerektiği hiçbir kaydırma yoktur.

Kapsayıcı için bir FillLayout (SWT.HORIZONTAL) kullandığımda, davranış kaydırma gibidir ve her şey "sınırlar içinde" olduğu için davranış istenir.

Bu davranışı bir GridLayout kullanırken de kullanmanın bir yolu var çünkü içeriğin çoğu alanı kapmasını istiyorum.

geçerli test SWT pasajı Ekli: Ben çözüm bulduk gibi

public class Scrolled { 
    public static void main(String[] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setLayout(new GridLayout(2,false)); 
     //shell.setLayout(new FillLayout(SWT.HORIZONTAL)); 

     Composite content = new Composite(shell, SWT.BORDER); 
     content.setLayoutData(new GridData(SWT.LEFT,SWT.CENTER,false,false)); 

     Composite sidebar = new Composite(shell, SWT.BORDER); 
     sidebar.setLayout(new FillLayout(SWT.VERTICAL)); 
     sidebar.setLayoutData(new GridData(SWT.LEFT,SWT.CENTER,false,false)); 

     Composite cc = new Composite(sidebar, SWT.BORDER); 

     ScrolledComposite sc = new ScrolledComposite(sidebar, SWT.BORDER 
       | SWT.V_SCROLL | SWT.H_SCROLL); 
     sc.setLayout(new GridLayout(1,true)); 

     Composite c = new Composite(sc, SWT.NONE); 
     c.setSize(400, 400); 
     c.setLayout(new GridLayout(1, true)); 

     for(int i = 0; i < 1000; i++){ 
      new Button(c, SWT.PUSH).setText("Text"); 
     } 

     sc.setMinSize(c.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
     sc.setContent(c); 
     sc.setExpandHorizontal(true); 
     sc.setExpandVertical(true); 
     sc.setAlwaysShowScrollBars(true); 

     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
     display.dispose(); 
    } 
} 

cevap

5

görünüyor.

Bir Kompozitin, mevcut genişlikle sınırlı olması için GRAB_EXCESS_VERTICAL alması gerektiği gibi görünüyor. Aksi halde, bileşen, tümünü bir kerede gösterecek maksimum yükseklik olan tercih edilen yüksekliğe atanır.

content.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true)); 

sidebar.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,true)); 
:

Aşağıdaki kod değişiklikleri hile yaptı