See: Description
Package | Description |
---|---|
org.netbeans.api.progress |
This API allows to visualize tracking for progress of long lasting tasks.
|
org.netbeans.api.progress.aggregate |
Advanced progress manipulation, allowing to construct a single progress indication bar
from multiple, possibly independent sources.
|
org.netbeans.modules.progress.spi |
Interfaces permitting a UI for the progress system to be supplied.
|
The module will be autoload. There is an api module and a pluggable implementation. Progress
The default action on ProgressHandle is sometimes non-visual: open a file, focus a result, display an output window associated with the task, etc. Abstract action can be used now with the basic Progress API without dependency on NB- or Swing- specific APIs.
Internal handle allows to inspect the last time the handle was pinged by the running process. This is needed to report stale processes and/or stop them.
Exposes Executor used by the Controller to deliver progress events, so that TaskModel can synchronize its change events to the same event stream.
Progress API was split so that parts that are directly connected to Swing types were migrated to a separate module. Please see it's API changes document for additional info. Affected classes:
ProgressUtils
class with runOffEventThreadWithCustomDialogContent
and runOffEventThreadWithProgressDialog
methods were added.
ProgressUtils
class with runOffEventThreadWithCustomDialogContent
and runOffEventThreadWithProgressDialog
methods were added. These methods allow movement of operations out of AWT thread, showing the waint cursor after one second and a dialog when task is not finished in a three seconds.
There are 3 types of progress indication:
The default location of the progress indication is the status bar which aggregates all tasks running in the IDE that show progress. However it's possible to exclude the task from the default location and show the progress in one's custom dialog component. In such a case the same task should not appear in the status line component as well.
It's possible to request cancelling the task from status line progress aggregator if the task allows cancelling.
Progress tasks that get started as a result of explicit user action takes precedence in the status line docked component over tasks that are triggered by the system. (say filesystem refresh for example)
The most common usecase of the API looks like this:
ProgressHandle handle = ProgressHandleFactory.creatHandle("My custom task"); ... // we have 100 workunits // at this point the task appears in status bar. handle.start(100); ... handle.progress(10); ... handle.progress("half way through", 50); ... handle.progress(99); // at this point the task is finished and removed from status bar // it's not realy necessary to count all the way to the limit, finish can be called earlier. // however it has to be called at the end of the processing. handle.finish();
In case your usage of the API
then you should consider using the aggregating version of APIs which is similar to the simple APIs but has distinctive differences and additions that allow for more complex scenarios.
It allows to compose the progress bar from 1+ independent sources, all sharing proportional piece of the progress bar. Additionally you can monitor the task's overall progress from one central place and possibly add more contributing sources of the progress during processing.
// let's have a factory for client code that performs some part of the job to be done.. Lookup.Result res = Lookup.getDefault().lookup(new LookupTemplate(MyWorkerFactory.class)); Iterator it = res.allInstances().iterator(); ProgressContributor[] contribs = new ProgressContributor[res.allInstances().size()]; int i = 0; while (it.hasNext()) { MyWorkerFactory prov = (MyWorkerFactory)it.next(); contribs[i] = AggregateProgressFactory.createProgressContributor("Module X contribution"); MyWorker worker = prov.createWorker(contribs[i]); //... snip ... do something with the worker.. i = i + 1; } AggregateProgressHandle handle = AggregateProgressFactory.createHandle("My Task", contribs, null, null); // non-cancellable and with out output link. // calling start() at the time when the actual long running task starts processing handle.start("here we go"); // ...snip... // now the individual MyWorker instances log their progress. // possibly in other threads too.. // ... snip... // if (myConditionThatSpawnsAnotherContributor()) { ProgressContributor cont = AggregateProgressFactory.createProgressContributor("Additional exceptional contribution"); handle.addContributor(cont); // ... snip ... } // the task is finished when all the ProgressContributors finish..
|
Nothing.
Read more about the implementation in the answers to architecture questions.