代码之家  ›  专栏  ›  技术社区  ›  Amit

SWT复合-重绘问题

  •  11
  • Amit  · 技术社区  · 17 年前

    我有一个复合元素,它最初有一个标签。现在,我调用Dispose(标签)并在同一容器(复合ELM)中创建另一个标签,但没有看到新的文本。这让我不禁要问,如何在组合上启用重绘,以便新标签(或我可能创建的任何其他组件)将呈现在旧标签的位置。 这是我所拥有的代码(分成一个单元测试来重新绘制一个组合)

    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();
            }
        });
    

    如您所见,我在添加一个新元素后调用了对组合的redraw。此外,我还验证了在调用Dispose后,testcell.getchildren().length返回0,如预期的那样,当我创建一个新标签时,我得到相同的表达式以返回1,验证是否确实将新元素添加到其父复合容器中。 我是不是错过了什么?

    2 回复  |  直到 14 年前
        1
  •  23
  •   Csaba_H    17 年前

    在 changeText() 函数

    testCell.redraw();

    行应替换为

    testCell.layout();

    或者,如果要正确调整大小,应该使用

    shell.layout(); .

        2
  •  -5
  •   Sergey Glotov Nitesh Khosla    14 年前

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

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