2011-10-05 30 views

Trả lời

8

Bạn chỉ cần bỏ Label và đặt Text mới vào vị trí của nó. GridLayout sử dụng thứ tự z của trẻ em để xác định vị trí trong lưới, vì vậy bạn sẽ cần phải sử dụng moveAbove()moveBelow() trên Text để nhận được vị trí chính xác. Sau đó, gọi số layout() trên phụ huynh. Ví dụ:

Text text = new Text(label.getParent(), SWT.BORDER); 
text.moveAbove(label); 
label.dispose(); 
text.getParent().layout(); 

Dưới đây là một widget đơn giản minh họa chính xác những gì tôi muốn nói:

public class ReplaceWidgetComposite 
    extends Composite 
{ 
    private Label label; 
    private Text text; 
    private Button button; 

    public ReplaceWidgetComposite(Composite parent, int style) 
    { 
     super(parent, style); 

     setLayout(new GridLayout(1, false)); 

     label = new Label(this, SWT.NONE); 
     label.setText("This is a label!"); 

     button = new Button(this, SWT.PUSH); 
     button.setText("Press me to change"); 
     button.addSelectionListener(new SelectionAdapter() 
     { 
      public void widgetSelected(SelectionEvent e) 
      { 
       text = new Text(ReplaceWidgetComposite.this, SWT.BORDER); 
       text.setText("Now it's a text!"); 
       text.moveAbove(label); 
       label.dispose(); 
       button.dispose(); 
       ReplaceWidgetComposite.this.layout(true); 
      } 
     }); 
    } 
} 
+0

Nó không làm việc một cách chính xác. Mã này gây ra chèn ô văn bản sau nhãn, nhưng tôi muốn thay thế nhãn. vứt bỏ() bằng cách nào đó không loại bỏ nhãn khỏi lưới vì nó vẫn hiển thị. – alhcr

+0

Việc xử lý tiện ích con sẽ xóa tiện ích đó khỏi tiện ích con. Hãy thử gọi 'parent.layout (true)'. –

+0

Có vẻ như nó không hoạt động như thế này. Tôi có shell.layout (true); và tôi biết nó hoạt động vì văn bản được chèn vào và tôi thấy nó, nhưng nhãn vẫn còn nhìn thấy được. Bạn đã sử dụng nó ở đâu đó và nó hoạt động chính xác? – alhcr

Các vấn đề liên quan