2009-06-21 88 views
10

我有一个复合元素,最初有一个标签。现在我在它上面调用dispose(标签)并在同一个容器(复合榆树)中创建另一个标签,但是我看不到新文本。它让我质疑如何在组合上启用重绘,以便新标签(或任何其他可能创建的组件)将会替代旧标签。 下面是代码我有(分成单元测试重绘复合)SWT复合 - 重绘问题

private Label createLabel(Composite parent) { 
    Label label = new Label(parent, SWT.NONE); 
    label.setAlignment(SWT.CENTER); 
    label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true)); 
    return label; 
} 

private void changeText() { 
    assert testCell != null : "Please initialize test cell"; 
    testCell.getChildren()[0].dispose(); 
    Label l = createLabel(testCell); 
    l.setText("New TexT"); 
    testCell.redraw(); 
} 

private void draw() { 
    Display display = new Display(); 
    shell = new Shell(display); 
    shell.setLayout(new GridLayout(2,false)); 

    testCell = new Composite(shell,SWT.BORDER); 
    testCell.setLayout(new GridLayout()); 
    Label l = createLabel(testCell); 
    l.setText("Old Text"); 
    Composite btnCell = new Composite(shell,SWT.NONE); 
    btnCell.setLayout(new GridLayout()); 
    Button b = new Button(btnCell, SWT.PUSH); 
    b.setText("Change"); 
    b.addListener(SWT.MouseDown, new Listener() { 
     public void handleEvent(Event e) { 
      changeText(); 
     } 
    }); 

正如你所看到的,我呼吁重绘在复合后,我加入了一个新元素。另外,我已经验证了在处理调用后,testCell.getChildren()。length返回0,如预期的那样,当我创建一个新标签时,我得到相同的表达式返回1,验证新元素确实得到添加到它的父级复合容器 我在这里错过了什么吗?

回答

22

changeText()功能,

testCell.redraw();

线应该由

testCell.layout();

更换或者,如果你想调整我t正确你应该使用

shell.layout();

+2

对不起重振这个话题,但我最近寻求类似的问题的解决方案,这个话题帮助了很多,但调整我的窗口,我不得不使用`shell.pack()``因为shell.layout ()`什么也没做。可能会对某人有帮助。 :) – mykola 2012-03-21 13:37:00

-5

我会说在标签上添加一个selectionListener。

.addSelectionListener(new SelectionAdapter() { 
    @Override 
    public void widgetSelected(final SelectionEvent e) { 
     //Change text by Label.setText(); 
    } 
}