java - SWT 进度条

标签 java eclipse multithreading swt progress-bar

我尝试在窗口的状态行中添加进度栏,其中状态行上已经有许多文本项(例如当前时间)。我想在将数据加载到窗口的框架之一(称为数据)时在进度条中取得进展。我对此没有什么问题。 (我对 SWT 还很陌生,所以请耐心等待。)

在 makeProgress 方法中,我尝试在进度栏中取得进展。以下是我的代码

public class Progress extends ContributionItem {

    private static org.eclipse.swt.widgets.ProgressBar progressBar;

    public Progress(final String id) {
        super(id);
    }

    @Override
    public void fill(final Composite parent) {
        if (progressBar == null) {
            progressBar = new ProgressBar(parent, SWT.None);
        }
        progressBar.setVisible(false);
    }

    public void makeProgress(final int loaded_data, final int total_data) {
        logger.log("progressitem do progress", new String [] {""});
        Display.getDefault().asyncExec(new Runnable() {
            public void run() {
                Progress.progressBar.setVisible(true);
                Progress.progressBar.setMaximum(total_data);
                Progress.progressBar.setSelection(loaded_data);
            }});
        if (loaded_data == total_data) {
            //When all of the data are loaded, make progress bar disappear
            Display.getDefault().asyncExec(new Runnable() {
                public void run() {
                    Progress.progressBar.setVisible(false);
                }});
        }
    }
}

其中 makeProgress 由处理状态栏的类调用,如下所示:change 是一种类型

if (change.getChange() == hasChanged.UPDATE_PROGRESS) {
            progress.makeProgress(change.getLoaded_data(), change.getTotal_data);

问题:

1) 我的进度条进展得很慢。可能需要正确使用线程?

2)虽然我尝试过,但我不太清楚 Display.getDefault.asyncExec 和syncExec 之间的区别。

3) 另一个问题是,当进度条进行时,整个 GUI 没有响应。如何使进度条独立于 GUI 上的其他 View ?

我非常感谢任何与此相关的指示或建议。

最佳答案

好的,这是一个简单的示例,其中包含从另一个线程不断更新的 ProgressBar。 GUI 始终保持响应:

private static Shell        shell;
private static ProgressBar  progressBar;

public static void main(String[] args)
{
    Display display = new Display();
    shell = new Shell(SWT.SHELL_TRIM);
    shell.setText("StackOverflow");
    shell.setLayout(new GridLayout(1, false));

    setUpContent();
    setUpStatusBar();

    updateProgressBar();

    shell.pack();
    shell.setSize(400, 200);
    shell.open();

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

private static void updateProgressBar()
{
    new Thread(new Runnable()
    {
        private int                 progress    = 0;
        private static final int    INCREMENT   = 10;

        @Override
        public void run()
        {
            while (!progressBar.isDisposed())
            {
                Display.getDefault().asyncExec(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        if (!progressBar.isDisposed())
                            progressBar.setSelection((progress += INCREMENT) % (progressBar.getMaximum() + INCREMENT));
                    }
                });

                try
                {
                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}

private static void setUpStatusBar()
{
    Composite statusBar = new Composite(shell, SWT.BORDER);
    statusBar.setLayout(new GridLayout(2, false));
    statusBar.setLayoutData(new GridData(SWT.FILL, SWT.END, true, false));

    progressBar = new ProgressBar(statusBar, SWT.SMOOTH);
    progressBar.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false));
    progressBar.setMaximum(100);

    Label status = new Label(statusBar, SWT.NONE);
    status.setText("Some status message");
    status.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, false));
}

private static void setUpContent()
{
    Composite content = new Composite(shell, SWT.NONE);
    content.setLayout(new GridLayout(2, false));
    content.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    Text text = new Text(content, SWT.BORDER | SWT.MULTI);
    text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
}
<小时/>

我猜测您的应用程序卡住且进度更新不顺利的原因是它在主线程而不是单独的线程上执行繁重的计算/长时间运行的任务。

关于java - SWT 进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25432418/

相关文章:

java - 在多线程中 hibernate @GeneratedValue序列

java - 为什么我的 Java 多线程代码不能正常工作?

java - Maven 编译无提示地失败 - Unresolved 编译问题

eclipse - 在 Eclipse 中,源 -> 格式在 "Maven Pom Editor"中被禁用

java - 我的 Android 应用程序在 Activity 生命周期方面无法正常工作

java - 这段代码如何违反 Demeter 法则?

c++ - 在 C++ 中删除命名空间 boost

java - 如何从 JAVA 字符串(文件路径)发送到 C?

java - JAVA中提取一部分JSON对象

java - 如何将文件路径发送到 mysql 表