java - SWT:用组件重新填充外壳时布局被破坏

标签 java swt

我想定期清除 shell 中的所有内容并重新创建其中的组件。这是我正在尝试做的一个最小的测试用例。起初,标签按照布局并排放置,但是当 updateThread 在五秒后触发时,新创建的标签全部相互重叠,完全忽略布局。

package testpkg;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;

public class Test {
    public static void main(String[] args){
        Display display = new Display();
        Shell testShell = new Shell(display);
        FillLayout testLayout = new FillLayout();
        testShell.setLayout(testLayout);
        for(int i = 1; i<20; i++){
            Label label = new Label(testShell, SWT.BORDER);
            label.setText("HELLO"+i);
            label.pack();
        }
        testShell.open();
        Thread updateThread = new Thread(new Runnable(){
            public void run(){
                try {Thread.sleep(5000);} catch (Exception e){};
                display.getDefault().syncExec(new Runnable(){
                    public void run(){
                        for(Control control : testShell.getChildren()){
                            control.dispose();
                        }
                        for(int i = 1; i<20; i++){
                            Label label = new Label(testShell, SWT.BORDER);
                            label.setText("HELLO"+i);
                            label.pack();
                        }
                    }
                });
            }
        });
        updateThread.start();
        while (!testShell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}

我想定期更新(可变数量的)标签,但当我这样做时布局完全破坏。

最佳答案

您可以将此行放在 for 循环之后:

    testShell.layout(true);

所以最终的 run() 方法将如下所示:

    public void run() {
      for (Control control : testShell.getChildren()) {
        control.dispose();
      }
      for (int i = 1; i < 20; i++) {
        Label label = new Label(testShell, SWT.BORDER);
        label.setText("HELLO"+i);
        label.pack();
      }
      testShell.layout(true);
    }

关于java - SWT:用组件重新填充外壳时布局被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32056442/

相关文章:

java - 当之前的一些行在我自己的 Eclipse 编辑器中折叠时获取当前行中的文本

multithreading - 使用jFace和SWT,将Gui线程作为主线程是更可取的还是无关紧要的?

java - 添加大量内容时 ScrolledComposite 渲染不正确

java - SWT 链接闪烁渐变背景

java - 使用|| If 语句中的 OR 运算符与字符并排

java - 扫描仪未关闭错误

java - 如何初始化这个数组以便它在 while 循环中工作?

java - 如何创建 JavaFX 纹理

java - SWT布局问题

java - tomcat docker容器在停止tomcat服务器后停止并退出