Java SWT强制重新绘制标签
我有一个设置标签文本的简单方法:Java SWT强制重新绘制标签,java,swt,label,Java,Swt,Label,我有一个设置标签文本的简单方法: public void setStatus(final String status) { statusLabel.setText(status); } 当我在任何类型的Display.asyncExec(Runnable)之前调用它时,它似乎在Runnable完成之后才执行。我甚至尝试在Runnable中实现它,但它不起作用。例如,我有一个“加载文件”菜单项,我希望在用户选择文件后状态显示为“加载:[filename]: MenuItem mnt
public void setStatus(final String status)
{
statusLabel.setText(status);
}
当我在任何类型的Display.asyncExec(Runnable)
之前调用它时,它似乎在Runnable
完成之后才执行。我甚至尝试在Runnable
中实现它,但它不起作用。例如,我有一个“加载文件”菜单项,我希望在用户选择文件后状态显示为“加载:[filename]:
MenuItem mntmLoadFile = new MenuItem(menu_4, SWT.NONE);
mntmLoadFile.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
String file = GuiWorkshop.selectFile(shell, new String[]{"*.apk"});
if(file != null){
try{
setStatus("Loading File: " + file);
controller.loadFile(new File(file));
} catch (Exception e){
GuiWorkshop.messageError(shell, "Could not load file: " + e.getMessage());
logger.error("Could not load file: ", e);
}
clearStatus();
}
}
});
mntmLoadFile.setText("Load file");
行
controller.loadFile(新文件(File))代码>执行所有加载,但setStatus
在完成之前不会更新。有没有办法在执行下一行之前强制完成?我不确定这是本地线程问题还是SWT线程问题。设置文本后必须刷新标签。控件API(它是所有SWT组件的超类)有一个方法redraw(),该方法再次调用create contents方法,并应提供您要查找的结果
我希望这有帮助。您可以在循环中调用Display.readAndDispatch()
,直到它返回false
。这将确保所有重画操作都已完成
...
setStatus("Loading File: " + file);
while (display.readAndDispatch())
{
// nothing to do
}
controller.loadFile(new File(file));
...
注意:您可能不想在UI线程上调用controller.loadFile()
。这将导致UI挂起。相反,您应该在后台线程中调用controller.loadFile()
。后台线程完成后,让UI线程更新状态。如果在setStatus(…)
方法中设置文本字符串后添加行statusLabel.redraw()
,它是否正确绘制?你提供的代码是在主线程中的(你的应用程序是单线程的吗)?多线程的,但是当重画似乎在单线程部分也没有帮助时。。。