2013-01-21 33 views
5

Tôi có một cửa sổ ứng dụng bằng cách sử dụng một Composite cuộn.Scrollable Composite - tự động thay đổi kích thước - swt

Composite cuộn bên trong, chúng tôi có thể có tổng hợp N (dữ liệu cơ sở dữ liệu phù hợp).

Làm cách nào để phát hiện kích thước vật liệu tổng hợp của trẻ em để đặt độ cao chính xác?

/** 
* Create contents of the application window. 
* @param parent 
*/ 
@Override 
protected Control createContents(Composite parent) { 

    final ScrolledComposite sc = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.BORDER); 
    final Composite containerEditarAtendimento = new Composite(sc, SWT.BORDER); 
    containerEditarAtendimento.setSize(800, 630); 
    sc.setContent(containerEditarAtendimento); 
    sc.setExpandHorizontal(true); 
    sc.setExpandVertical(true); 
    sc.setMinSize(containerEditarAtendimento.computeSize(820, 480)); 
    GridLayout gridLayout = new GridLayout(1, false); 
    gridLayout.marginTop = 5; 
    gridLayout.marginRight = 5; 
    gridLayout.marginBottom = 5; 
    gridLayout.marginLeft = 5; 
    containerEditarAtendimento.setLayout(gridLayout); 
    { // Composite com as informações de atendimento. 
     EditarAtendimentoComposite editarAtendimentoComposite = new EditarAtendimentoComposite(containerEditarAtendimento, SWT.BORDER); 
     GridData gd_editarAtendimentoComposite = new GridData(GridData.FILL, GridData.FILL, true, false); 
     gd_editarAtendimentoComposite.heightHint = 249; 
     editarAtendimentoComposite.setLayoutData(gd_editarAtendimentoComposite); 
    } 
    { 
     Composite compoExterno = formToolkit.createComposite(containerEditarAtendimento, SWT.BORDER); 
     compoExterno.setLayout(new GridLayout(3, false)); 
     GridData gd_compoExterno = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1); 
     gd_compoExterno.heightHint = 153; 
     compoExterno.setLayoutData(gd_compoExterno); 

     formToolkit.paintBordersFor(compoExterno); 
     { 
      Label lblAnexos = formToolkit.createLabel(compoExterno, getLabel("label.anexos"), SWT.NONE); 
     } 
     new Label(compoExterno, SWT.NONE); 
     { 
      Button btnAddAnexo = formToolkit.createButton(compoExterno, getLabel("label.incluiranexo"), SWT.NONE); 
      btnAddAnexo.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); 
     } 
     { // Composite com os anexos 
      AnexosComposite anexosComposite = new AnexosComposite(compoExterno,SWT.BORDER); 
      GridData gd_anexosComposite = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1); 
      gd_anexosComposite.heightHint = 107; 
      anexosComposite.setLayoutData(gd_anexosComposite); 

     } 

    } 
    { // Composite onde ficará o expandable do diagnostico 
     PlanoAcaoExternoComposite planoAcaoComposite = new PlanoAcaoExternoComposite(containerEditarAtendimento, SWT.BORDER); 
     GridData gd_planoAcaoComposite = new GridData(GridData.FILL, GridData.FILL, true, false); 
     planoAcaoComposite.setLayoutData(gd_planoAcaoComposite); 
     formToolkit.adapt(planoAcaoComposite); 
     formToolkit.paintBordersFor(planoAcaoComposite); 
     planoAcaoComposite.layout(true, true); 
     log.info("Height: {}",planoAcaoComposite.getClientArea().height); 
     log.info("getSize().x: {}",planoAcaoComposite.getSize().x); 
     log.info("getSize().y: {}",planoAcaoComposite.getSize().y); 
     sc.setMinSize(containerEditarAtendimento.computeSize(800, 2000)); // HOW TO DYNAMICALLY SET HEIGHT? 
    } 
    sc.layout(true,true); 
    return containerEditarAtendimento; 
} 

Cảm ơn bạn đã ủng hộ.

Trả lời

13

Các mã sau đây sẽ làm cho ScrolledComposite thiết lập minSize theo nội dung và hiển thị các thanh cuộn nếu bạn giảm kích thước của Shell:

ScrolledComposite sc = new ScrolledComposite(content, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); 

Composite composite = new Composite(sc, SWT.NONE); 
composite.setLayout(new FillLayout(SWT.VERTICAL)); 

new Label(composite, SWT.NONE).setText("1111"); 
new Label(composite, SWT.NONE).setText("2222"); 
new Label(composite, SWT.NONE).setText("3333"); 
new Label(composite, SWT.NONE).setText("4444"); 
new Label(composite, SWT.NONE).setText("5555"); 
new Label(composite, SWT.NONE).setText("6666"); 
new Label(composite, SWT.NONE).setText("7777"); 

sc.setContent(composite); 
sc.setExpandHorizontal(true); 
sc.setExpandVertical(true); 
sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
+0

Cảm ơn bạn !! Tôi sẽ thử ... – davidfdr

+0

Nó đã hoạt động! Cảm ơn bạn một lần nữa Baz! – davidfdr

+0

@davidfdr Vui vì tôi có thể giúp. Xin vui lòng xem xét upvoting câu trả lời là tốt. – Baz

0

Nội dung của một cửa sổ cuộn cần phải có mặt ở đó, và cố định cài đặt grabExxcessHorizontalspace và dọc thành "true".

public class SWT_Composite_scroll_test { 

    private static Display display; 
    private Font font; 
    public static FontData[] fontdata, tmp; 
    public static FontData fd; 
    public String name; 
    public static String fontname; 
    public String DIALOG; 
    public String DIALOGINPUT; 
    public String MONOSPACED; 
    public String SERIF; 
    public String SANS_SERIF; 
    public String LUCIDIA; 
    public int size, data, style, Plain=0, Bold=1, Italic=2; 
    Object[] font_objects; 
    String[] font_names, styletype = {"Normal","Bold","Italic"}; 
    SWT_Composite_scroll_test(){} 

    public static void main(String args[]){ 
      display = new Display(); 
      tmp = new FontData[Display.getDefault().getFontList(null, false).length]; 
      for(int j=0;j<tmp.length;j++){ tmp[j] = Display.getDefault().getFontList(null, false)[j];} 
      System.out.println("System fonts loaded."); 
      SWT_Composite_scroll_test c = new SWT_Composite_scroll_test(); 
      c.getFonts(); 

    } 

private void getFonts(){ 

     final Shell fontdialog = new Shell(display,SWT.BORDER|SWT.PRIMARY_MODAL|SWT.RESIZE|SWT.CLOSE); 
          fontdialog.setText(Parent.getResourceString("Set fonts for system. ")); 
          /* Create 3 unevenly columns in dialog*/ 
          fontdialog.setLayout(new GridLayout(3,false)); 
        Label label = new Label(fontdialog,SWT.FILL); 
          /* set label 3 columns wide, grab all horizontal space, but vertical just one row.*/ 
          label.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,false,3,1)); 
          label.setText("Dit is een text."); 

      final Composite tablecontainer = new Composite(fontdialog,SWT.BORDER|SWT.V_SCROLL|SWT.H_SCROLL); 
        /* Design tablecontainer layout, no spacing to prevent white spots when content is scrolled.*/ 
        GridLayout gl = new GridLayout(); 
        gl.marginLeft = 0; 
        gl.marginHeight = 0; 
        gl.marginBottom = 0; 
        gl.marginRight = 0; 
        gl.verticalSpacing = 0; 
        gl.horizontalSpacing = 0; 
        tablecontainer.setLayout(gl); 
        /* Completely fill and grab all vertical space for content, one column and one row.*/ 
        final GridData tblgd = new GridData(SWT.FILL,SWT.FILL,true,true,1,1); 
        tablecontainer.setLayoutData(tblgd); 

        final Composite tableheader = new Composite(tablecontainer,SWT.FILL|SWT.INHERIT_DEFAULT); 
          tableheader.setFont(Configuration.default_font); 
          RowLayout rlb = new RowLayout(); 
          rlb.pack = false;//<-------------(all elements are the same size). 
          rlb.justify = true;// <------- (elements are spread across the available space). 
          tableheader.setLayout(rlb); 
          tableheader.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,false)); 
         final Label subjectcolumn = new Label(tableheader,SWT.FILL|SWT.LEFT|SWT.INHERIT_DEFAULT); 
            subjectcolumn.setText(Parent.getResourceString("Subject name")); 
         final Label namecolumn = new Label(tableheader,SWT.FILL|SWT.CENTER|SWT.INHERIT_DEFAULT); 
            namecolumn.setText(Parent.getResourceString("Font name")); 
         final Label stylecolumn = new Label(tableheader,SWT.FILL|SWT.CENTER|SWT.INHERIT_DEFAULT); 
            stylecolumn.setText(Parent.getResourceString("Font style")); 
         final Label sizecolumn = new Label(tableheader,SWT.FILL|SWT.CENTER|SWT.INHERIT_DEFAULT); 
            sizecolumn.setText(Parent.getResourceString("Font size")); 

        final Composite table = new Composite(tablecontainer,SWT.INHERIT_DEFAULT); 
            RowLayout tbfl = new RowLayout(); 
            tbfl.type = SWT.VERTICAL; 
            table.setLayout(tbfl); 
            table.setFont(Configuration.default_font); 
            final GridData tbge = new GridData(SWT.FILL,SWT.FILL,false,false); 
            table.setLayoutData(tbge); 

            Group testgroup = new Group(table, SWT.FILL); 
            testgroup.setLayout(new GridLayout()); 
            new Label(testgroup,SWT.INHERIT_DEFAULT).setText("This is a test label in side the scrolled content."); 
            new Label(testgroup,SWT.INHERIT_DEFAULT).setText("This is a test label in side the scrolled content."); 
            Button resize = new Button(testgroup, SWT.PUSH); 
            resize.setText("Rezise bigger"); 
            resize.addSelectionListener(new SelectionAdapter() { 
               @Override 
               public void widgetSelected(SelectionEvent e) {     
                 tablecontainer.setSize(tablecontainer.getSize().x<<1,tablecontainer.getSize().y<<1); /* resize scrolled composite setting data height x 2;*/ 
                 tablecontainer.layout(); 
                 } 
                }); 
            Button resizeS = new Button(testgroup, SWT.PUSH); 
            resizeS.setText("Rezise smaller"); 
            resizeS.addSelectionListener(new SelectionAdapter() { 
               @Override 
               public void widgetSelected(SelectionEvent e) {     
                 tablecontainer.setSize(tablecontainer.getSize().x>>1,tablecontainer.getSize().y>>1); /* resize scrolled composite setting data height x 2;*/ 
                 tablecontainer.layout(); 
                 } 
                }); 
         for(int i=0;i<tmp.length;i++){ 
          Composite tablerow = new Composite(table,SWT.FILL);       
              RowLayout rlc = new RowLayout(); 
              rlc.center = true; 
              rlc.fill = true; 
              rlc.pack = false;//<-------------(all elements are the same size). 
              rlc.wrap = false;// <------- (clips if not enough space). [ This one makes content invisible when out of sight. ] 
              rlc.marginLeft = 1; 
              rlc.marginHeight = 1; 
              rlc.marginBottom = 1; 
              rlc.marginRight = 1; 
              rlc.marginWidth = 1; 
              rlc.spacing = 1; 
              tablerow.setLayout(rlc); 
              new Label(tablerow, SWT.INHERIT_DEFAULT).setText(tmp[i].getName()); 
        System.out.println(tableheader.getBounds().width+"2: vPage:"+table.getSize().y+" vSelection:"+tablecontainer.getClientArea().y); 
              final Combo fontcombo = new Combo(tablerow, SWT.RIGHT);       
               fontcombo.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); 
               fontcombo.setBackground(display.getSystemColor(SWT.COLOR_RED)); 
        for(int j=0;j<tmp.length;j++){fontcombo.add(""+tmp[j].getName());} 
               fontcombo.addSelectionListener(new SelectionListener() { 
                public void widgetSelected(SelectionEvent e) { 
                 fd = Display.getDefault().getFontList(null, true)[fontcombo.getSelectionIndex()];  
                 } 
                @Override 
                public void widgetDefaultSelected(SelectionEvent e) {} 
                }); 
              final Combo stylecombo = new Combo (tablerow, SWT.INHERIT_DEFAULT); 
               for(int j=0;j<styletype.length;j++){stylecombo.add(styletype[j]);} 
               stylecombo.addSelectionListener(new SelectionListener() { 
                public void widgetSelected(SelectionEvent e) { 
                 style = stylecombo.getSelectionIndex();  
                 } 
                @Override 
                public void widgetDefaultSelected(SelectionEvent e) {} 
                }); 
              final Combo sizecombo = new Combo(tablerow,SWT.RIGHT|SWT.INHERIT_DEFAULT); 
               for(int j=0;j<28;j++){sizecombo.add(""+j);} 
               sizecombo.addSelectionListener(new SelectionListener() { 
                public void widgetSelected(SelectionEvent e) { 
                 size = sizecombo.getSelectionIndex();  
                 } 
                @Override 
                public void widgetDefaultSelected(SelectionEvent e) {} 
                }); 
              } 
       final ScrollBar vBar = tablecontainer.getVerticalBar(); 
       final ScrollBar hBar = tablecontainer.getHorizontalBar(); 
         vBar.addListener(SWT.Selection, new Listener() { 
          @Override 
          public void handleEvent(Event e) { 
           int contentY = table.getSize().y - tableheader.getSize().y;  // total height of the page. [ table ] 
           int windowY = tablecontainer.getSize().y - tableheader.getSize().y;// total height of the window [ tablecontainer ]. 
           int locationY = vBar.getSelection() - tableheader.getSize().y; // point where table is in window. 0 = top. 
           int vPageEnd = contentY - windowY; 
           if(locationY >= vPageEnd){ locationY = vPageEnd ;} 
           table.setLocation(5, - locationY);        // 5 is left margin. 
           } 
          }); 
         hBar.addListener(SWT.Selection, new Listener() { 
          @Override 
          public void handleEvent(Event e) {  
           /* Horizontal scrolbar.*/ 
           int contentX = table.getSize().x - vBar.getSize().x;        // total height of the page. [ table ] 
           int windowX = tablecontainer.getSize().x - vBar.getSize().x;      // total height of the window [ tablecontainer ]. 
           int locationX = hBar.getSelection();       // point where table is in window. 0 = top. 
           int hPageEnd = contentX - windowX; 
           if(locationX >= hPageEnd){ locationX = hPageEnd ;} 
           table.setLocation(-locationX+5, tableheader.getSize().y);        // 5 is left margin. 
           } 
          }); 
         tablecontainer.addListener(SWT.Resize, new Listener() { 
          @Override 
          public void handleEvent(Event e) { 
           int contentY = table.getSize().y - tableheader.getSize().y-9;          // total height of the page. [ table ] 
           int contentX = table.getSize().x - vBar.getSize().x; 
           int windowY = tablecontainer.getSize().y - tableheader.getSize().y-9; // total height of the window [ tablecontainer ]. 
           int windowX = tablecontainer.getSize().x - vBar.getSize().x; 
           int locationY = vBar.getSelection() - tableheader.getSize().y;    // point where table is in window. 0 = top. 
           int locationX = hBar.getSelection(); 
           int vPageEnd = contentY - windowY; 
           int hPageEnd = contentX - windowX; 
           vBar.setMaximum(contentY); 
           hBar.setMaximum(contentX); 
           if(vPageEnd>contentY){vBar.setThumb(vPageEnd - windowY);}else{vBar.setThumb(windowY);} 
           if(hPageEnd>contentX){hBar.setThumb(hPageEnd - windowX);}else{hBar.setThumb(windowX);} 
           if(locationY >= vPageEnd) {locationY = vPageEnd;} 
           if(locationX >= hPageEnd) {locationX = hPageEnd;} 
           if(e.widget.equals(vBar)){table.setLocation(5,-locationY);} 
           else {table.setLocation(-locationX,tableheader.getSize().y);} 
           } 
          }); 
         fontdialog.addListener(SWT.Resize, new Listener() { 
          @Override 
          public void handleEvent(Event e) { 

           } 
          });  
       Button save = new Button(fontdialog, SWT.PUSH); 
       save.setText(Parent.getResourceString("Save new settings")); 
       save.addSelectionListener(new SelectionAdapter() { 
         public void widgetSelected(SelectionEvent e) { 
          } 
         });    
       new Label(fontdialog, SWT.SHADOW_OUT); /* Filler */ 
       Button ok = new Button(fontdialog, SWT.PUSH); 
       ok.setText(Parent.getResourceString("Done")); 
       fontdialog.setDefaultButton(ok); 
       ok.addSelectionListener(new SelectionAdapter() { 
          @Override 
          public void widgetSelected(SelectionEvent e) {     
            fontdialog.dispose(); 
            } 
           }); 
      fontdialog.pack(); 
      fontdialog.setSize(display.getClientArea().width>>1,display.getClientArea().height>>1); 
      fontdialog.open(); 
      for(;!fontdialog.isDisposed();) { 
         if (!fontdialog.getDisplay().readAndDispatch()) 
          fontdialog.getDisplay().sleep(); 
         } 
     } 
    }