2014-11-01 35 views
1

我有一個SWT文本字段,其內容長度將動態變化。我需要使整個文本可見。我正在使用下面的代碼來做到這一點。動態調整SWT文本字段的大小

public class MyDynamicDialog extends TrayDialog { 
    Text errorMessageText; 
    ScrolledComposite scrolledComposite; 
    Shell shell; 
    DynamicData dynamicData; 

    public MyDynamicDialog (final Shell shell) { 
     super(shell); 
     this.shell = shell; 
    } 
    public MyDynamicDialog (final Shell shell, final DynamicData dynamicData) { 
     super(shell); 
     this.shell = shell;  
     this.dynamicData = dynamicData; 
    } 

    @Override 
    protected Control createDialogArea(final Composite parent) { 
     final GridLayout layout = new GridLayout(); 
     parent.setLayout(layout); 
     this.scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.BORDER); 
     this.scrolledComposite.setExpandHorizontal(true); 
     this.scrolledComposite.setExpandVertical(false); 

     final Composite composite = new Composite(this.scrolledComposite, SWT.NONE); 
     final GridLayout gridLayout = new GridLayout(); 
     gridLayout.numColumns = 2; 
     composite.setLayout(gridLayout); 
     composite.setSize(400, 400); 

     this.scrolledComposite.setContent(composite); 

     this.scrolledComposite.addControlListener(new ControlAdapter() { 
      @Override 
      public void controlResized(final ControlEvent e) { 
       final Rectangle clientArea =  
       MyDynamicDialog.this.scrolledComposite.getClientArea(); 
       final Point minSize = MyDynamicDialog.this.scrolledComposite.getContent().computeSize(clientArea.width, SWT.DEFAULT); 
       MyDynamicDialog.this.scrolledComposite.getContent().setSize(minSize); 
      } 
     }); 
     createErrorMessageText(composite); 
     return parent; 
    } 

    private void createErrorMessageText(final Composite parent) { 
     final GridData errText = new GridData(/*200, SWT.DEFAULT*/); 
     errText.grabExcessHorizontalSpace = true; 
     errText.horizontalSpan = 3; 
     errText.horizontalAlignment = GridData.FILL; 
     this.errorMessageText = new Text(parent, SWT.READ_ONLY /*| SWT.WRAP | SWT.MULTI*/); 
     this.errorMessageText.setLayoutData(errText); 

     this.errorMessageText.addModifyListener(new ModifyListener() { 
      public void modifyText(final ModifyEvent e) { 

       final int columns = MyDynamicDialog.this.errorMessageText.getText().length() + 3; 
       final GC gc = new GC (MyDynamicDialog.this.errorMessageText); 
       final FontMetrics fm = gc.getFontMetrics(); 
       final int width = columns * fm.getAverageCharWidth(); 
       final int height = fm.getHeight(); 
       gc.dispose(); 
       MyDynamicDialog.this.errorMessageText.setSize (MyDynamicDialog.this.errorMessageText.computeSize (width, height)); 
       MyDynamicDialog.this.errorMessageText.redraw(); 
       MyDynamicDialog.this.errorMessageText.getParent().layout(); 

      } 
     }); 
    } 
} 

enter image description here

有了這個代碼,當文本是大,它超出屏幕。我無法在運行時調整文本字段的大小。我還嘗試在調整文本框大小後再次調用滾動合成器上的偵聽器。但沒有一個可行。請指出可能是錯的。

回答

3

當您使用可覆蓋任何setSize的佈局時,您可以在控件上進行操作。

改爲將GridData上的widthHint設置爲所需的寬度(也是heightHint)。

您還必須佈置整個對話框區域,然後調整殼體大小。

Composite dialogAreaComp = ... get the dialog area composite 

dialogAreaComp.layout(true, true); 


Shell shell = getShell(); 
shell.pack(true);