SWT笔记2——测试UI线程的事件处理

本文通过两个按钮演示了如何在SWT框架中处理长时间运行的任务:一是直接阻塞UI线程,二是使用独立线程并在适当时候更新UI,避免阻塞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[img]http://dl.iteye.com/upload/attachment/0065/7109/1b691960-f9ba-35bb-99b3-6b62b8dee1a8.png[/img]


import org.eclipse.swt.widgets.Display;


public class TestEventQueue {
public static void main(String[] args) {
final Display display = Display.getDefault();
Shell shell = new Shell();
shell.setSize(450, 300);
shell.setText("测试事件循环");

//直接处理,阻塞UI线程
final Button btnBlock = new Button(shell, SWT.NONE);
btnBlock.setToolTipText("直接处理事件,费时的操作会阻塞UI线程");
btnBlock.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
btnBlock.setText("按下按钮后的文字");
}
});
btnBlock.setBounds(10, 10, 107, 27);
btnBlock.setText("\u963B\u585EUI\u7EBF\u7A0B");

//新线程中处理费事的操作,再用display.syncExec()函数提交改变UI的操作,该操作会阻塞UI线程,但改变外观时间很短,忽略不计;不阻塞用display.asyncExec().
final Button btnUnblock = new Button(shell, SWT.NONE);
btnUnblock.setToolTipText("新线程中处理费事的操作,再用display.syncExec()函数提交改变UI的操作,该操作会阻塞UI线程,但改变外观时间很短,忽略不计;不阻塞用display.asyncExec()");
btnUnblock.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
new Thread(new Runnable() {

@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
display.syncExec(new Runnable() {
@Override
public void run() {
btnUnblock.setText("按下按钮后的文字");

}
});

}
}).start();

}
});
btnUnblock.setBounds(192, 10, 118, 27);
btnUnblock.setText("\u4E0D\u963B\u585EUI\u7EBF\u7A0B");

shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值