我有一个TitleAreaDialog
只有几个按钮和一个ProgressBar
,在选择任何按钮时会执行某些操作,所以我需要ProgressBar
来指示用户一些操作正在进行中。由于时间未知,我在全局创建进度条,类型为SWT.INDETERMINATE
和setVisibility(false)
(因此仅在触发按钮侦听器时才会显示进度),并且每当按下按钮时,执行
progressBar.setVisible(true)
progressBar.setVisible(false)
这是正确的方法吗?因为我没有得到所需的输出。 我需要进度条仅在执行操作时可用/可见,而不是在整个对话框生命期间。
答案 0 :(得分:1)
当您的按钮操作在UI线程中运行时,progressBar无法更新。您可以使用Job在后台执行操作:
public class MyLayout {
public static void main (String [] args) {
final Display display = new Display ();
Shell shell = new Shell (display);
RowLayout rowLayout = new RowLayout ();
shell.setLayout (rowLayout);
Button button = new Button (shell, SWT.PUSH);
button.setText ("button0");
final ProgressBar progressbar = new ProgressBar (shell, SWT.NONE);
progressbar.setSelection (50);
progressbar.setVisible(false);
button.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
progressbar.setVisible(true);
// make a background operation
Job job = new Job("Button...") {
@Override
protected IStatus run(IProgressMonitor monitor) {
// do the button operation...
return Status.OK_STATUS;
}
};
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent jobEvent) {
// update progressbar in UI thread
display.syncExec(new Runnable() {
@Override
public void run() {
progressbar.setVisible(false);
}
});
}
});
job.schedule();
}
});
shell.pack ();
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ())
display.sleep ();
}
display.dispose ();
}
}
但是Job本身还提供了一个监视器来向用户显示正在进行的操作。