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()
,它是否正确绘制?你提供的代码是在主线程中的(你的应用程序是单线程的吗)?多线程的,但是当重画似乎在单线程部分也没有帮助时。。。