我正在测试一个简单的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");
答案 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的愚蠢错误,即使它在初始化后使用。