Java 切换swt小部件的设置可见性

Java 切换swt小部件的设置可见性,java,swt,jface,rcp,Java,Swt,Jface,Rcp,我有一个TitleAreaDialog和一个ProgressBar,在选择任何按钮时,将执行某些操作,因此我需要ProgressBar来指示用户某些操作正在进行中。由于时间未知,我正在全局创建进度条,类型为SWT.undeterminate和setVisibility(false)(因此只有在触发按钮侦听器时才会显示进度),并且每当按下按钮时,执行以下操作: progressBar.setVisible(true) 执行操作(progressBar应处于活动状态,即应显示为加载状态) progr

我有一个
TitleAreaDialog
和一个
ProgressBar
,在选择任何按钮时,将执行某些操作,因此我需要
ProgressBar
来指示用户某些操作正在进行中。由于时间未知,我正在全局创建进度条,类型为
SWT.undeterminate
setVisibility(false)
(因此只有在触发按钮侦听器时才会显示进度),并且每当按下按钮时,执行以下操作:

  • progressBar.setVisible(true)
  • 执行操作(progressBar应处于活动状态,即应显示为加载状态)
  • progressBar.setVisible(false)
  • 这是正确的方法吗?因为我没有得到想要的输出。
    我需要进度条仅在执行操作时可用/可见,而不是在对话框生命周期内。当您的按钮操作在UI线程中运行时,进度条无法更新。您可以使用作业在后台执行操作:

    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 ();
        }
    }
    

    但作业本身也提供了一个监视器,向用户显示操作正在进行。

    最好使用单页向导-向导内置了进度条支持。