SWT StackLayout topControl显然无法正常工作

时间:2015-03-14 02:19:38

标签: java layout swt

我正在测试一个简单的SWT StackLayout示例,以了解它是如何工作的,但事情并没有像我预期的那样工作。

我创建了一个StackLayout,上面有两个按钮,两个按钮设置为在选中它们时将两个顶部控件循环五次,每次顶部控件改变时暂停2秒。但是,当我运行问题时,我看不到任何事情发生。

关于我缺少的任何想法?

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;


public class MyApp {

    protected Shell shlMyFirstSwt;
    Button btnOne;
    Button btnTwo;

    /**
     * Launch the application.
     * @param args
     */
    public static void main(String[] args) {
        try {
            MyApp window = new MyApp();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Open the window.
     */
    public void open() {
        Display display = Display.getDefault();
        createContents();
        shlMyFirstSwt.open();
        shlMyFirstSwt.layout();
        while (!shlMyFirstSwt.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    /**
     * Create contents of the window.
     * @throws InterruptedException 
     */
    protected void createContents() {
        shlMyFirstSwt = new Shell();
        shlMyFirstSwt.setSize(621, 416);
        shlMyFirstSwt.setText("My First SWT Application");
        StackLayout layout = new StackLayout();
        shlMyFirstSwt.setLayout(layout);

        Button btnOne = new Button(shlMyFirstSwt, SWT.NONE);
        btnOne.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                for (int i = 0; i != 10; i++) {
                    layout.topControl = i % 2 == 0? btnOne : btnTwo;
                    shlMyFirstSwt.layout();
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });
        btnOne.setText("One");

        Button btnTwo = new Button(shlMyFirstSwt, SWT.NONE);
        btnTwo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                for (int i = 0; i != 10; i++) {
                    layout.topControl = i % 2 == 0? btnOne : btnTwo;
                    shlMyFirstSwt.layout();
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });
        btnTwo.setText("Two");
    }
}

在第一次回答后阐述:

尝试更简单的方法而不延迟。现在我修改了事件处理程序,只需一个按钮就可以将顶部控件切换为另一个按钮,如下所示。我希望两个按钮交替作为顶部控件,但是当我点击第一个按钮时,窗口变成空白。知道为什么吗?

        Button btnOne = new Button(shlMyFirstSwt, SWT.NONE);
        btnOne.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                layout.topControl = btnTwo;
                shlMyFirstSwt.layout();
            }
        });
        btnOne.setText("One");

        Button btnTwo = new Button(shlMyFirstSwt, SWT.NONE);
        btnTwo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                layout.topControl = btnOne;
                shlMyFirstSwt.layout();
            }
        });
        btnTwo.setText("Two");

2 个答案:

答案 0 :(得分:1)

您的Thread.sleep调用阻止了用户界面线程,因此GUI不会更新。您绝不能像这样阻止用户界面线程。对layout之类的方法的调用不会立即更新 - 它们需要运行display.readAndDispatch来分派生成的各种更新。

如果您想延迟使用Display.timerExec

Display.getDefault().timerExec(2000, new Runnable() {
   @Override
   public void run()
   {
     ... code to be run after the delay
   }
});

因此,您必须重新编写代码才能使用此代码进行定时更新。

答案 1 :(得分:0)

想出来:只是在初始化之前在第一个事件处理程序中包含btnTwo的愚蠢错误,即使它在初始化后使用