进度条不会立即更新

Sou*_*are 7 java windows swt progress-bar

我试图使用进度条和标签来显示谨慎的操作数量的进度.每次我更新两者时,标签立即更新,而进度条在更改之前有明显的延迟.

我有一个测试对话框,当我按下按钮时,我更新标签和进度条以反映增加1.这在代码中立即发生,没有任何循环或线程被调用(消除任何与线程相关的问题,如成为原因) - 只是简单地改变价值观.发生这种情况时,Label会立即更新,而Progress Bar会在视觉更新之前等待大约半秒钟.这导致例如,当它短暂但明显地显示填充的1/3时,它会说"2中3".

在此输入图像描述

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;

public class ProgressBarTest extends Shell {

    private ProgressBar progressBar;
    private Label lblXOfX;
    private Button btnGo;

    public static void main(String args[]) {
        try {
            Display display = Display.getDefault();
            ProgressBarTest shell = new ProgressBarTest(display);
            shell.open();
            shell.layout();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public ProgressBarTest(Display display) {
        super(display, SWT.SHELL_TRIM);
        createContents();
    }

    protected void createContents() {
        setText("SWT Application");
        setSize(450, 300);
        setLayout(new GridLayout());

        progressBar = new ProgressBar(this, SWT.NONE);
        progressBar.setMaximum(3);
        progressBar.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        lblXOfX = new Label(this, SWT.NONE);
        lblXOfX.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
        lblXOfX.setText("x of x");

        btnGo = new Button(this, SWT.NONE);
        btnGo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                go();
            }
        });
        btnGo.setText("Go");
    }

    @Override
    protected void checkSubclass() {
        // Disable the check that prevents subclassing of SWT components
    }

    protected void go() {

        int iCur = progressBar.getSelection();
        iCur++;
        if (iCur > progressBar.getMaximum())
            iCur = 0;

        progressBar.setSelection(iCur);
        lblXOfX.setText(String.format("%s of %s", iCur, progressBar.getMaximum()));
    }

}
Run Code Online (Sandbox Code Playgroud)

尽管使用Progress Bar的内部变量来跟踪值,并使用该值更新标签,但仍会发生这种情况.

值得注意的是,将进度条的"State"属性更改为"ERROR"或"PAUSED"可以消除此问题.

这是动画的某种错误吗? 这只是特定版本Windows的问题,例如我使用的Windows 7?或者是别的什么?

gre*_*449 4

看起来这可能是 Windows 版本中的一个错误,ProgressBar因为代码可以在 Linux 和 Mac OS X 上运行。

Windows 版本ProgressBar.setSelection确实有一些代码表明它正在尝试处理听起来像这样的问题,但只有在状态不正常时才会完成 - 这可能就是它在错误和暂停状态下工作的原因。他们的修复只是再次进行选择,所以也许调用setSelection两次会起作用!