【问题标题】:an indeterminate progressbar in new window in swtswt新窗口中的不确定进度条
【发布时间】:2012-07-03 10:55:31
【问题描述】:

我正在使用窗口生成器设计 java 应用程序的界面。我需要做的是.. 点击一个按钮做两件事 1. 做一些后台任务 2. 在此过程中,在新窗口中显示一个不确定的进度条。 我知道我需要多线程来实现这一点。

我尝试了一些教程的帮助,但无法实现。

谁能帮忙?

代码: 我要打开进度条窗口的函数

public void mouseDown(MouseEvent e) {
pbar p=new pbar();
p.caller();
dowork();

p.closeprogress();

}

进度条类

import org.eclipse.swt.widgets.Display;


public class pbar {

protected Shell shell;

public void pcaller() {
    try {
    //System.err.println("Error: " + bod);


//System.err.println("Error: " + lines);
        pbar window = new pbar();
        window.open();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Open the window.
 */
public void open() {
    Display display = Display.getDefault();
    createContents();
    shell.open();
    shell.layout();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
}

/**
 * Create contents of the window.
 */
protected void createContents() {
    shell = new Shell();
    shell.setSize(315, 131);
    shell.setText("Updating!!! Please Wait");

    ProgressBar progressBar = new ProgressBar(shell, SWT.INDETERMINATE);
    progressBar.setBounds(47, 34, 195, 17);
//  ProgressBar pb2 = new ProgressBar(shell, SWT.HORIZONTAL | 

SWT.INDETERMINATE);
   // pb2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}

public void close()
{
    shell.close();
}
}

我希望当我调用 p.caller() 时,会出现进度条。然后,控制权应该来到原始程序并执行 dowork() 方法。当我完成这个方法时,它会调用 p.progress.close()。 我不知道为什么不理解这个简单的程序,忘记回答。

【问题讨论】:

    标签: java progress-bar swt windowbuilder


    【解决方案1】:

    是否可以使用 JFace? 如果是这样,您可以使用 ProgressMonitorDialog 类。

    ProgressMonitorDialog dialog = new ProgressMonitorDialog(parent.getShell());
    dialog.run(true, true, new SomeTask());
    
    ...
    
    class SomeTask implements IRunnableWithProgress {
    
        @Override
        public void run(IProgressMonitor monitor) throws InvocationTargetException,
                InterruptedException {
            monitor.beginTask("Doing some task", IProgressMonitor.UNKNOWN);
            for(int i = 0; i < 1000; i++) {
                if (!monitor.isCanceled())
                    Thread.sleep(10);
            }
    
            monitor.done();
        }
    }
    

    你可以在这里找到完整的example of usage

    【讨论】:

    • 我不想设置时间。当新对话框 bx 打开时,显示进度条,我希望它是不确定的,即经过一个循环,然后我希望控件返回调用程序并执行一些任务,在此任务结束后,我将关闭进度条窗口。
    • 不需要设置时间。只需在任务的实际工作开始之前使用 IProgressMonitor.UNKNOWN 参数调用 beginTask.run。您将获得带有循环动画的进度监视器。从后台任务代码调用 monitor.done 后,该动画将立即停止。
    • 据我了解,前两行要写在调用程序中。它在 parent.getShell() 中显示错误。
    • @VIPULGOYAL 如我所见,您无法从 mouseDown 处理程序提供适当的外壳。所以请尝试将 Display.getActiveShell() 传递给 ProgressMonitorDialog 的构造函数,而不是 parent.getShell()。那会奏效的。但是最好找到与发生的鼠标事件相关的shell。
    • OK,一个进度对话框打开,但控件保留在其中,直到所有这些迭代完成。只有在那之后,在 dialog.run(true, true, new SomeTask()); 之后编写的任何语句执行。谢谢。
    【解决方案2】:

    尝试使用.....

    JProgressBar p = new JProgressBar();
    p.setStringPainted();
    

    现在需要设置值。

     p.setValue(val);
    

    完成后显示一条消息。

    p.setString("done");
    

    【讨论】:

    • 我不想设置值。我不知道我的其他任务需要多少时间,所以进度条应该是一个不确定的。
    • 使用 setValue() 我写了一个程序,我使用了进度条,它根据进度显示值,如果它花费时间,进度值保持不变,直到花费的时间没有完成。 ..然后相应地进步,现在如果你不想要 setValue(),不要使用它..就这么简单..
    • ProgressBar 的 setStringPainted() 方法未定义。
    • JProgressBar 确实有 setStringPainted(boolean b) 方法...试试看..我已经为您的帮助编辑了代码
    • 使用最上面的两行没有进度条显示在屏幕上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多