【问题标题】:Toggle setVisibility for swt widget切换 swt 小部件的 setVisibility
【发布时间】:2018-08-22 22:52:17
【问题描述】:

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

  1. progressBar.setVisible(true)
  2. 执行操作(progressBar 应处于活动状态,即应显示为正在加载)
  3. progressBar.setVisible(false)

这是正确的方法吗?因为我没有得到想要的输出。 我需要进度条仅在执行操作时可用/可见,而不是在整个对话框生命周期中。

【问题讨论】:

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

标签: java swt jface rcp


【解决方案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 本身也提供了一个监视器来向用户显示操作正在进行中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2011-10-21
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多