Aktualisierungsproblem mit einer Progressbar

Dragowob

Grünschnabel
Hi
Habe folgendes Problem:

Habe ein static Composite auf dem eine Progressbar liegt. Ist im Grunde meine Fußzeile der Anwendung. Dort möchte ich nun die Fortschritt bei unterschiedlichen Aktionen anzeigen.

Habe mir in der Klasse eine Funktion setProgress geschrieben.
Sie funktioniert auch meistens nur leider nicht immer.

Denn wenn ich nun eine Tabelle erstelle und diese Befülle und während des befüllen der Tabelle die Progressbar setzen möchte interessiert ihn das nicht wirklich denn der Fortschritt wird leider nicht angezeigt.

Hat irgendjemand eine Idee woran das liegen könnte?

Nn noch kurz die Funktion in der statischen Klasse:

public static void setProgess(int prozent){
compositeProgress.getChildren()[1].dispose();
compositeProgress.getChildren()[0].dispose();
if(prozent > 100){
prozent = 100;
}
progressBarPercent = prozent;
ProgressBar progressBar = new ProgressBar(compositeProgress,SWT.RIGHT);
progressBar.setSelection(progressBarPercent);

labelProgress = new Label(compositeProgress, SWT.RIGHT);
labelProgress.setText(progressBarPercent + " % ");
compositeProgress.layout();
}
 
Hallo,

sprichst du vielleicht die ProgressBar aus dem falschen Thread an? (Gibts vielleicht sowas wie ne InvalidThreadAccessException?)

Zeig doch mal ein minimal lauffähiges Codebeispiel das dein Problem demonstriert.

Gruß Tom
 
Minimal ist gut :suspekt:

/**
*
*/
package vwg.vw.common.project.ala.view.fenster.haupt;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;

import vwg.vw.common.project.ala.global.Global;
import vwg.vw.common.project.ala.model.ProjectComposite;
import vwg.vw.common.project.ala.model.database.Aenderer;

/**
* @author d1aboor
*
*/
public class CompositeHauptStatus extends ProjectComposite {
private static Composite compositeStatus;

private static Composite compositeStatusFeld;

private static Composite compositeAenderer;

private static Composite compositeAendererZeit;

private static Composite compositeAendererDatum;

private static Composite compositeProgress;

private static Composite compositeAnzahl;

private static Label labelStatus;

private static Label labelAenderer;

private static Label labelAenderDatum;

private static Label labelAenderZeit;

private static Label labelProgress;

private static Label labelAnzahl;

private static Composite parent;

private static int progressBarPercent;

private static int anzahl;

/**
* constructor
*/
public CompositeHauptStatus(Composite parents, int style, int progressBarPercents) {
super(parent, style);
parent = parents;
progressBarPercent = progressBarPercents;

initialize();

}

public static void initialize() {
createCompositeElements();
}

private static void createCompositeElements() {
compositeStatus = new Composite(parent, SWT.NONE);
GridLayout gridlayout = new GridLayout();
gridlayout.horizontalSpacing = 0;
gridlayout.verticalSpacing = 0;
gridlayout.marginBottom = 0;
gridlayout.marginTop = 0;
gridlayout.marginHeight = 0;
gridlayout.marginLeft = 0;
gridlayout.marginRight = 0;
gridlayout.marginWidth = 0;
gridlayout.numColumns = 6;

compositeStatus.setLayout(gridlayout);

compositeStatusFeld = new Composite(compositeStatus, SWT.BORDER);
compositeStatusFeld.setLayout(new GridLayout());
GridData gridStatus = new GridData();
gridStatus.widthHint = 450;
compositeStatusFeld.setLayoutData(gridStatus);

compositeAenderer = new Composite(compositeStatus, SWT.BORDER);
compositeAenderer.setLayout(new GridLayout());
GridData gridAenderer = new GridData();
gridAenderer.widthHint = 160;
compositeAenderer.setLayoutData(gridAenderer);

compositeAendererDatum = new Composite(compositeStatus, SWT.BORDER);
compositeAendererDatum.setLayout(new GridLayout());
GridData gridDatum = new GridData();
gridDatum.widthHint = 180;
compositeAendererDatum.setLayoutData(gridDatum);

compositeAendererZeit = new Composite(compositeStatus, SWT.BORDER);
compositeAendererZeit.setLayout(new GridLayout());
GridData gridZeit = new GridData();
gridZeit.widthHint = 160;
compositeAendererZeit.setLayoutData(gridZeit);

compositeAnzahl = new Composite(compositeStatus, SWT.BORDER);
compositeAnzahl.setLayout(new GridLayout());
GridData gridAnzahl = new GridData();
gridAnzahl.widthHint = 100;
compositeAnzahl.setLayoutData(gridAnzahl);

compositeProgress = new Composite(compositeStatus, SWT.NONE);
GridLayout gridprogress = new GridLayout();
gridprogress.numColumns = 2;
compositeProgress.setLayout(gridprogress);
GridData gridProgress = new GridData();
gridProgress.widthHint = 220;
compositeProgress.setLayoutData(gridProgress);

createLabelElements();
}
private static void createLabelElements() {

labelStatus = new Label(compositeStatusFeld, SWT.NONE);
labelStatus.setText(" User: " + Global.getBenutzer().getUserid() + " ("
+ Global.getBenutzerRolle()
+ ") @ " + Global.getHauptUmgebung().getName() + " / Applikation: "
+ Global.getApplikation());

labelAenderer = new Label(compositeAenderer, SWT.NONE);
labelAenderer.setText(" Aenderungs-User: ");

labelAenderDatum = new Label(compositeAendererDatum, SWT.NONE);
labelAenderDatum.setText(" Aenderungs-Datum: ");

labelAenderZeit = new Label(compositeAendererZeit, SWT.NONE);
labelAenderZeit.setText(" Aenderungs-Zeit: ");

labelAnzahl = new Label(compositeAnzahl, SWT.NONE);
labelAnzahl.setText(" Anzahl: ");

ProgressBar progressBar = new ProgressBar(compositeProgress,SWT.NONE);
progressBar.setSelection(progressBarPercent);

labelProgress = new Label(compositeProgress, SWT.RIGHT);
labelProgress.setText(progressBarPercent + " %");
}

public static void setAenderer(Aenderer aenderers){
if(aenderers != null){
compositeAenderer.getChildren()[0].dispose();
labelAenderer = new Label(compositeAenderer, SWT.NONE);
labelAenderer.setText(" Aenderungs-User: "
+ aenderers.getAenderername());
compositeAenderer.layout();

compositeAendererDatum.getChildren()[0].dispose();
labelAenderDatum = new Label(compositeAendererDatum, SWT.NONE);
labelAenderDatum.setText(" Aenderungs-Datum: "
+ aenderers.getAenderdatum());
compositeAendererDatum.layout();

compositeAendererZeit.getChildren()[0].dispose();
labelAenderZeit = new Label(compositeAendererZeit, SWT.NONE);
labelAenderZeit.setText(" Aenderungs-Zeit: "
+ aenderers.getAendererzeit());
compositeAendererZeit.layout();
}
}

public static void setProgess(int prozent){
compositeProgress.getChildren()[1].dispose();
compositeProgress.getChildren()[0].dispose();
if(prozent > 100){
prozent = 100;
}
progressBarPercent = prozent;
ProgressBar progressBar = new ProgressBar(compositeProgress,SWT.RIGHT);
progressBar.setSelection(progressBarPercent);

labelProgress = new Label(compositeProgress, SWT.RIGHT);
labelProgress.setText(progressBarPercent + " % ");
compositeProgress.layout();
}

public static void setAnzahl(int anzahls){
compositeAnzahl.getChildren()[0].dispose();
anzahl = anzahls;

labelAnzahl = new Label(compositeAnzahl, SWT.NONE);
labelAnzahl.setText(" Anzahl: " + anzahl);
compositeAnzahl.layout();
}

public static void clearStatus(){
progressBarPercent = 0;
compositeAenderer.getChildren()[0].dispose();
compositeAendererDatum.getChildren()[0].dispose();
compositeAendererZeit.getChildren()[0].dispose();
compositeProgress.getChildren()[1].dispose();
compositeProgress.getChildren()[0].dispose();
compositeAnzahl.getChildren()[0].dispose();
createLabelElements();
compositeAenderer.layout();
compositeAendererDatum.layout();
compositeAendererZeit.layout();
compositeProgress.layout();
compositeAnzahl.layout();
}
}

Das ist meine Statische Klasse.
Ich arbeite garnicht mit Threads, daran kann es zum Glück schonmal nicht liegen.

Ich mache nichts anderes als während einer For Schleife folgenden Befehl ausführen zu wollen.

CompositeHauptStatus.setProgess(i);

Ich hoffe daran kannst du es testen bzw nachvollziehen

Der CompositeHauptStatus ist in einem Fenster unten dazu geaddet und dadrüber ist eine Tabelle zu sehen. Die Tabelle und die Statuszeile liegen auf eine Sashform.

Hatte auch schonmal probiert nicht nur das Composite nur zeichnen zu lassen mit .Layout sondern auch die Shell was aber leider nichts brachte :mad:
 
Habe nun die Lösung des Problems:

Die Methode setProgress muss wie folgt aussehen:

public static void setProgess(int prozent){
if(prozent > 100){
prozent = 100;
}
progressBarPercent = prozent;
progressBar.setSelection(progressBarPercent);
progressBar.update();

labelProgress.setText(progressBarPercent + " %");
compositeProgress.layout();
}

Man darf dort anscheinend nicht die Progressbar disposen und neu adden.
Warum ist mir ehrlich gesagt nicht bekannt, ich weißnur nun gehts :-)
 
Zurück