1

似乎不可能将单个 SWT 进度条小部件的状态从确定切换到不确定 (SWT.INDETERMINATE) 并返回。我想根据用户交互来做,这可能很频繁,所以处理和重新创建可能不是最好的主意。

我尝试的解决方案是隐藏确定栏并显示不确定栏并强制重新布局父复合材料。

但是,通过这样做,该条将不会重新出现在同一位置,这表明隐藏元素占用了它的空间。是否可以进行就地更换?

4

2 回答 2

3

这里。使用 StackLayout 和两个 ProgressBar 实例。或者,使用 JProgessBar#setIndeterminate(boolean)

于 2013-10-15T11:19:23.300 回答
0

您可以简单地将其包装ProgressBar在 a 中Composite,然后dispose()在您想要更改它并ProgressBar使用您想要的样式创建一个新的时使用它:

private static ProgressBar  bar;
private static boolean indeterminate = false;

public static void main(String[] args)
{
    final Display display = Display.getDefault();
    final Shell shell = new Shell(display);
    shell.setLayout(new GridLayout(1, false));

    new Button(shell, SWT.PUSH).setText("Above");

    final Composite barParent = new Composite(shell, SWT.NONE);
    barParent.setLayout(new GridLayout(1, false));
    barParent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    bar = new ProgressBar(barParent, SWT.SMOOTH);
    bar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    bar.setMaximum(10);
    bar.setSelection(5);

    new Button(shell, SWT.PUSH).setText("Below");

    final Runnable timer = new Runnable()
    {
        public void run()
        {
            if (bar.isDisposed())
                return;

            indeterminate = !indeterminate;

            bar.dispose();
            bar = new ProgressBar(barParent, indeterminate ? SWT.INDETERMINATE : SWT.SMOOTH);
            bar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
            bar.setMaximum(10);
            bar.setSelection(5);
            barParent.layout();

            display.timerExec(2000, this);
        }
    };
    display.timerExec(2000, timer);

    shell.pack();
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

不定:

在此处输入图像描述

光滑的:

在此处输入图像描述

于 2013-10-15T11:29:05.120 回答