我尝试使用进度条和标签来显示一系列操作的进度。每次更新它们时,标签会立即更新,而进度条在改变之前会有明显的延迟。我有一个测试对话框,在按下按钮时,我会更新标签和进度条以反映增加1。这个过程在代码中立即发生,没有调用任何循环或线程(消除了任何与线程相关的问题作为原因),只是简单地改变值。当这种情况发生时,标签立即更新,而进度条需要大约半秒钟才能在视觉上更新。这导致出现这样的情况,例如当它短暂但明显地显示1/3的填充时,它会说“2 out of 3”。
尽管使用进度条的内部变量来跟踪值并使用该值更新标签,仍会发生此问题。值得注意的是,将进度条的“状态”属性更改为“ERROR”或“PAUSED”可消除此问题。这是否是动画中的某种错误?这只是特定版本的Windows(例如我正在使用的Windows 7)的问题吗?还是其他什么原因?
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()));
}
}
尽管使用进度条的内部变量来跟踪值并使用该值更新标签,仍会发生此问题。值得注意的是,将进度条的“状态”属性更改为“ERROR”或“PAUSED”可消除此问题。这是否是动画中的某种错误?这只是特定版本的Windows(例如我正在使用的Windows 7)的问题吗?还是其他什么原因?
ProgressBar
中使用的动画有关,因为其他状态都没有动画。此外,您的代码在Linux上完美运行。您可以在此处发布错误报告,让开发人员知道。 - BazProgressBar.setSelection
的 Windows 版本确实有一些代码尝试处理类似于这样的问题,但仅在状态不为 Normal 时执行 - 这可能是它在错误和暂停状态下工作的原因。他们的解决方案只是再次进行选择,所以可能调用setSelection
两次会起作用! - greg-449PBM_SETPOS
的选择。这是未记录的。修复方法是再次调用PBM_SETPOS
。” 因此,似乎这是解决 Vista 问题的方法... 绝对值得提交错误报告。 - Baz