A
Andi K
Gast
Hab mich daran gemacht eine ProgressBar für mein Programm zu erstellen und eigentlich auch darauf geachtet, dass die Methoden, die die Werte der ProgressBar berechnen als separater Thread ausgeführt werden und Methoden, die die ProgressBar erstellen bzw. den Progressbalken verändern syncExec() aufrufen.
Trotzdem muss sich wohl ein Fehler eingeschlichen haben, denn die ProgressBar, die eigentlich parallel zur Methode laufen soll, wegen der ich sie eigentlich erstellt habe, startet erst, nachdem die Methode abgearbeitet wurde.
Vielen Dank im Voraus!
Trotzdem muss sich wohl ein Fehler eingeschlichen haben, denn die ProgressBar, die eigentlich parallel zur Methode laufen soll, wegen der ich sie eigentlich erstellt habe, startet erst, nachdem die Methode abgearbeitet wurde.
Vielen Dank im Voraus!
Code:
//Hier starten die Methodenaufrufe für die ProgressBar und die Methode für die die ProgressBar "benötigt" wird
controller.initProgress(getParent());
controller.initStat(T_input.getText());
//initialisiert die ProgressBar
public void initProgress(Shell parent) {
DemoProgressBar dpb = new DemoProgressBar(parent);
dpb.createContents();
Thread t = new Thread(dpb);
t.start();
}
//hier wird die ProgressBar initialisiert
public class DemoProgressBar extends ProgressBarDialog{
private String[] info = null;
public DemoProgressBar(Shell parent) {
super(parent);
}
public void createContents(){
super.createContents();
}
public void run(){
initGauge();
open();
}
@Override
public void initGauge() {
info = new String[100];
for (int i = 0; i < info.length; i++) {
info[i] = "process task " + i + ".";
}
this.setExecuteTime(100);
this.setMayCancel(true);
this.setProcessMessage("please waiting....");
this.setShellTitle("Demo");
}
@Override
public String process(int arg0) {
try{
Thread.sleep((long)(Math.random() * 300));
}catch(Exception e){e.printStackTrace();}
return info[arg0 - 1];
}
}
public abstract class ProgressBarDialog extends Dialog implements Runnable{
private Label processMessageLabel; //info of process finish
private Button cancelButton; //cancel button
private Composite cancelComposite;
private Label lineLabel;//
private Composite progressBarComposite;//
private CLabel message;//
private ProgressBar progressBar = null; //
private Object result; //
private Shell shell; //
private Display display = null;
protected volatile boolean isClosed = false;//closed state
protected int executeTime = 50;//process times
protected String processMessage = "process......";//procress info
protected String shellTitle = "Progress..."; //
//protected Image processImage = SWTUtil.getImageOfMessage();//image
protected boolean mayCancel = true; //cancel
protected int processBarStyle = SWT.SMOOTH; //process bar style
public abstract void run();
public void setMayCancel(boolean mayCancel) {
this.mayCancel = mayCancel;
}
public void setExecuteTime(int executeTime) {
this.executeTime = executeTime;
}
/*public void setProcessImage(Image processImage) {
this.processImage = processImage;
}*/
public void setProcessMessage(String processInfo) {
this.processMessage = processInfo;
}
public ProgressBarDialog(Shell parent) {
super(parent);
}
public abstract void initGauge();
public Object open() {
display.asyncExec(new Runnable() {
public void run() {
shell.open();
shell.layout();
}
});
//start work
new ProcessThread(executeTime).start();
display.asyncExec(new Runnable() {
public void run() {
Display display = getParent().getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
});
return result;
}
public void createContents() {
shell = new Shell(getParent(), SWT.TITLE | SWT.PRIMARY_MODAL);
display = shell.getDisplay();
display.syncExec(new Runnable() {
public void run() {
final GridLayout gridLayout = new GridLayout();
gridLayout.verticalSpacing = 10;
shell.setLayout(gridLayout);
shell.setSize(483, 181);
shell.setText(shellTitle);
final Composite composite = new Composite(shell, SWT.NONE);
composite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
composite.setLayout(new GridLayout());
message = new CLabel(composite, SWT.NONE);
//message.setImage(processImage);
message.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
message.setText(processMessage);
progressBarComposite = new Composite(shell, SWT.NONE);
progressBarComposite.setLayoutData(new GridData(GridData.FILL,
GridData.CENTER, false, false));
progressBarComposite.setLayout(new FillLayout());
progressBar = new ProgressBar(progressBarComposite, processBarStyle);
progressBar.setMaximum(executeTime);
processMessageLabel = new Label(shell, SWT.NONE);
processMessageLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
lineLabel = new Label(shell, SWT.HORIZONTAL | SWT.SEPARATOR);
lineLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
cancelComposite = new Composite(shell, SWT.NONE);
cancelComposite.setLayoutData(new GridData(GridData.END,
GridData.CENTER, false, false));
final GridLayout gridLayout_1 = new GridLayout();
gridLayout_1.numColumns = 2;
cancelComposite.setLayout(gridLayout_1);
cancelButton = new Button(cancelComposite, SWT.NONE);
cancelButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
isClosed = true;
//System.out.println(isClosed);
}
});
cancelButton.setLayoutData(new GridData(78, SWT.DEFAULT));
cancelButton.setText("Close");
cancelButton.setEnabled(true);
}
});
}
public abstract String process(int times);
public void cleanUp()
{
}
public void doBefore()
{
}
public void doAfter()
{
}
class ProcessThread extends Thread {
private int max = 0;
private volatile boolean shouldStop = false;
ProcessThread(int max) {
this.max = max;
}
public void run() {
doBefore();
for (final int[] i = new int[] {1}; i[0] <= max; i[0]++)
{
//
final String info = process(i[0]);
if (display.isDisposed()) {
return;
}
display.syncExec(new Runnable() {
public void run() {
if (progressBar.isDisposed()) {
return;
}
//
processMessageLabel.setText(info);
//
progressBar.setSelection(i[0]);
//
if (i[0] == max || isClosed) {
if (isClosed) {
shouldStop = true;//
cleanUp();//
}
shell.close();//
}
}
});
if (shouldStop) {
break;
}
}
doAfter();
}
}
public void setShellTitle(String shellTitle) {
this.shellTitle = shellTitle;
}
public void setProcessBarStyle(boolean pStyle) {
if(pStyle)
this.processBarStyle = SWT.SMOOTH;
else
this.processBarStyle = SWT.NONE;
}
}