如何在 asyncExec() 调用中更新 SWT GUI
How to update SWT GUI in asyncExec() call
在我的 SWT GUI 中,我想要一个启动作业的按钮,并在运行该作业时更新一个文本框,该文本框将显示该作业的事件日志。但是,直到我的 asyncExec() 调用结束,我的文本框才会更新。在下面的示例中,我希望我的文本框每秒更新一次,但它在执行完 10 秒后立即获取所有更新。
有办法实现吗?
private void UpdateUI()
{
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run()
{
StringBuilder sb = new StringBuilder();
for(int i=1; i<=10; i++)
{
sb.append("Running iteration " + i + "\n");
txtLogBox.setText(sb.toString());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}});
}
您正在 UI 线程中休眠。您需要在另一个线程中完成长时间的 运行 工作,并且仅 post 使用 asyncExec
更新 UI 线程。例如:
new Thread(new Runnable() {
public void run()
{
StringBuilder sb = new StringBuilder();
for(int i=1; i<=10; i++)
{
sb.append("Running iteration " + i + "\n");
final String result = sb.toString();
Display.getDisplay().asyncExec(new Runnable() {
public void run()
{
txtLogBox.setText(result);
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
在我的 SWT GUI 中,我想要一个启动作业的按钮,并在运行该作业时更新一个文本框,该文本框将显示该作业的事件日志。但是,直到我的 asyncExec() 调用结束,我的文本框才会更新。在下面的示例中,我希望我的文本框每秒更新一次,但它在执行完 10 秒后立即获取所有更新。
有办法实现吗?
private void UpdateUI()
{
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run()
{
StringBuilder sb = new StringBuilder();
for(int i=1; i<=10; i++)
{
sb.append("Running iteration " + i + "\n");
txtLogBox.setText(sb.toString());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}});
}
您正在 UI 线程中休眠。您需要在另一个线程中完成长时间的 运行 工作,并且仅 post 使用 asyncExec
更新 UI 线程。例如:
new Thread(new Runnable() {
public void run()
{
StringBuilder sb = new StringBuilder();
for(int i=1; i<=10; i++)
{
sb.append("Running iteration " + i + "\n");
final String result = sb.toString();
Display.getDisplay().asyncExec(new Runnable() {
public void run()
{
txtLogBox.setText(result);
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();