问题:
您能否展示 SWT 显示部分(更新窗口/外壳)的任何简单示例或说明?或者您能找到任何您认为最适合 SWT 应用程序开发的网站吗?
背景:
我是 SWT 应用程序的新手,目前正在构建一个用于运行一些测试的应用程序。
它有一个带有文本区域的主显示外壳类,在用户单击运行按钮后会不断更新。
运行按钮启动另一个线程进程,该进程更新公共静态对象,例如 StartView 类中的 AtomicCounter。
当前阶段
该程序似乎运行良好,但是,它不会实时更新文本区域。好吧,我不能说实时,但它显示了一些延迟的信息。(我可以说它是延迟的,因为我也在控制台上打印出来)
似乎我不太了解 SWT 的显示概念,无法做我想做的任何事情。
目标
A. 无论 B 是否运行,启动和停止 C 的主显示类
B. 使用 A 的公共静态对象更新 A 类的文本区域的线程化进程
C. 执行其工作并更新 A 的公共静态对象的线程进程
示例代码(工作代码)
public class UnitTest {
public static Display display;
private Shell shell;
public static AtomicInteger counter = new AtomicInteger(0);
public static Text text;
private TestThread test1 = null, test2 = null;
public UnitTest()
{
display = Display.getDefault();
this.shell = new Shell(display, SWT.CLOSE);
this.shell.setSize(226, 120);
text = new Text(shell, SWT.BORDER);
text.setBounds(10, 10, 199, 19);
Button btnStart = new Button(shell, SWT.NONE);
btnStart.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
test1 = new TestThread();
test1.start();
test2 = new TestThread();
test2.start();
}
});
btnStart.setBounds(10, 54, 94, 28);
btnStart.setText("Start");
Button btnStop = new Button(shell, SWT.NONE);
btnStop.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
test1.interrupt();
test2.interrupt();
counter.set(0);
}
});
btnStop.setBounds(115, 54, 94, 28);
btnStop.setText("Stop");
this.shell.open();
this.shell.layout();
this.shell.addListener(SWT.Close, new Listener(){
public void handleEvent(Event event)
{
shell.dispose();
}
});
while(!this.shell.isDisposed())
{
if(!display.readAndDispatch())
{
//text.setText(""+counter.get());
display.sleep();
}
}
}
public static void main(String[] args)
{
new UnitTest();
}
}
class TestThread extends Thread
{
public void run()
{
try
{
int i = 0;
while(i++ < 1000 && !this.isInterrupted() )
{
UnitTest.counter.getAndIncrement();
try {
TestThread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}
if(UnitTest.display.isDisposed())
return;
UnitTest.display.asyncExec(new Runnable() {
public void run() {
if (UnitTest.text.isDisposed())
return;
UnitTest.text.setText(""+UnitTest.counter.get());
}
});
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
System.out.println("Existing thread...");
}
}
}