Problem mit ProgressMonitor?

Hi.

Ich habe einen ProgressMonitor und bekomme neuerdings Exceptions bei einer scheinbar zu hohen Anzahl von Steps.
Beeinflussen tut es den ProgressMonitor auf den ersten Blick nicht, aber ok ist es ja trotzdem nicht.

Die Exceptions die nur einmal kommt und zwar am Anfang, wenn es mit den Exceptions losgeht.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at java.util.Hashtable.put(Unknown Source)
	at sun.font.PhysicalStrike.getGlyphPoint(Unknown Source)
	at sun.font.SunLayoutEngine.nativeLayout(Native Method)
	at sun.font.SunLayoutEngine.layout(Unknown Source)
	at sun.font.GlyphLayout$EngineRecord.layout(Unknown Source)
	at sun.font.GlyphLayout.layout(Unknown Source)
	at sun.font.ExtendedTextSourceLabel.createGV(Unknown Source)
	at sun.font.ExtendedTextSourceLabel.getGV(Unknown Source)
	at sun.font.ExtendedTextSourceLabel.createLogicalBounds(Unknown Source)
	at sun.font.ExtendedTextSourceLabel.getAdvance(Unknown Source)
	at java.awt.font.TextLine.init(Unknown Source)
	at java.awt.font.TextLine.<init>(Unknown Source)
	at java.awt.font.TextLine.fastCreateTextLine(Unknown Source)
	at java.awt.font.TextLayout.fastInit(Unknown Source)
	at java.awt.font.TextLayout.<init>(Unknown Source)
	at sun.font.FontDesignMetrics.stringWidth(Unknown Source)
	at sun.swing.SwingUtilities2.stringWidth(Unknown Source)
	at javax.swing.SwingUtilities.layoutCompoundLabelImpl(Unknown Source)
	at javax.swing.SwingUtilities.layoutCompoundLabel(Unknown Source)
	at javax.swing.plaf.basic.BasicLabelUI.layoutCL(Unknown Source)
	at javax.swing.plaf.basic.BasicLabelUI.getPreferredSize(Unknown Source)
	at javax.swing.plaf.basic.BasicLabelUI.getMinimumSize(Unknown Source)
	at javax.swing.JComponent.getMinimumSize(Unknown Source)
	at java.awt.GridBagLayout.GetLayoutInfo(Unknown Source)
	at java.awt.GridBagLayout.getLayoutInfo(Unknown Source)
	at java.awt.GridBagLayout.minimumLayoutSize(Unknown Source)
	at java.awt.Container.minimumSize(Unknown Source)
	at java.awt.Container.getMinimumSize(Unknown Source)
	at javax.swing.JComponent.getMinimumSize(Unknown Source)
	at java.awt.BorderLayout.minimumLayoutSize(Unknown Source)
	at java.awt.Container.minimumSize(Unknown Source)
	at java.awt.Container.getMinimumSize(Unknown Source)
	at javax.swing.JComponent.getMinimumSize(Unknown Source)
	at java.awt.BorderLayout.minimumLayoutSize(Unknown Source)
	at java.awt.Container.minimumSize(Unknown Source)
	at java.awt.Container.getMinimumSize(Unknown Source)
	at javax.swing.JComponent.getMinimumSize(Unknown Source)
	at javax.swing.BoxLayout.checkRequests(Unknown Source)
	at javax.swing.BoxLayout.layoutContainer(Unknown Source)
	at java.awt.Container.layout(Unknown Source)
	at java.awt.Container.doLayout(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validate(Unknown Source)
	at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Und die Exceptions die dann mit jedem nächsten Schritt kommt:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.SizeRequirements.calculateAlignedPositions(Unknown Source)
	at javax.swing.BoxLayout.layoutContainer(Unknown Source)
	at java.awt.Container.layout(Unknown Source)
	at java.awt.Container.doLayout(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validate(Unknown Source)
	at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Ist das ein bekannter bug oder mache ich einfach nur was falsch? Bzw. für den Fall, dass es ein Bug ist, gibts da ein workaround?

Grüße
Morgyr

Nur aus Neugier: ProgressMonitor ist ja nichts sichtbares… Was meinst du denn mit „Steps“?
Ein KSKB, bei dem der Fehler reproduzierbar auftritt wäre vielleicht hilfreich (spätestens wenn du es in die Sun Bugdatabase stellen willst :wink: )

Wie, ProgressMonitor ist nichts sichtbares? ProgressMonitor hat ja nur den einen Konstruktor und dort gebe ich unter anderem eine parentComponent an. ProgressMonitor ist also scheinbar ein modaler Dialog. Bestätigung findet sich in der Praxis.

Naja, steps sind im Prinzip die Anzahl aller Aktionen deren Verlauf über den ProgressMonitor gezeigt sollen. Den Begriff gibts auch nicht in der Doku. Das hab ich mir wohl ausgedacht. Ist zu lang her, als ich den eingebaut habe.

Die Sache ist, ich habe ProgressMonitor nicht wesentlich verändert. Es wurden keine Methoden überschrieben.
Hier die komplette Klasse.

	private static final long serialVersionUID = 1L;

	private int value;
	private GUI gui;

	public ProgressDialog(GUI gui, JFrame parent, String title, int steps) {
		super(parent, title, "Progress", 0, steps);
		Logging.addLog("Initializing a new ProgressDialog");
		this.gui = gui;
		//setMillisToPopup(0);
		value = 0;
	}

	public void setNextStep(String label) {
		if (!isCanceled()) {
			setProgress(++value);
			setNote(label);
		} else {
			setProgress(getMaximum());
			gui.progressStoppedByUser();
		}
	}
}

Das war es. Vielleicht fällt da ja schon was auf.

Mit KSKB ist scheinbar bissl schwer, scheinbar spielt da noch irgendwas beim ProgressMonitor rein.
Ganz roh macht der auch bei 2000 “Steps” noch keine Probleme, mein Programm hingegen beschwerte sich schon bei 300 und dann schon ab Schritt 50.

Ich als Anfänger kann nur spekulieren: Können da Speicher-Probleme auftreten?
Kurz mal ein Anschnitt der Funktionen die ich mit dem Monitor überwache:
Ich speichere und öffne zip-Files. Zwischendurch wird dabei eine Datei ausgelesen/geschrieben, die spezielle Daten enthält. Ansonsten sind da eben normale Dateien wie sie in jedem anderen zip auch vorkommen. Also definitiv nichts besonderes. Sobald die Datenmengen größer werden, treten nur halt Probleme auf. Ist es möglich, das da der Speicher Probleme macht und der Garbage Collector irgendwas einsammelt, was der Progress Monitor noch braucht?

Also fürs KSKB versuch ich noch ein bisschen rum, ob ich da was gebastelt bekomme, poste ich dann die Tage, sollte sich da noch was ergeben.

Ein ProgressMonitor macht einen Dialog auf, ja, aber er selbst IST kein Dialog… nicht so wichtig.
Ein erster (oder in ANbetracht der Uhrzeit eher: für heut letzter) Gedanke wäre, dass es ein Problem sein könnte, wenn setProgress usw. nicht auf dem Event Dispatch Thread aufgerufen werden… aber das ist nur geraten, müßte man genauer schauen…

Hängt das denn mit meinem Code zusammen? Bzw. kann es damit zusammen hängen. Wenn ich das soweit richtig überblicke, mache ich da gar nichts mit irgendwelchen Threads. Das ganze läuft nur über über diesen GUI Thread.

Ja, es ist schwer zu sagen, was diesen Fehler verursacht. Im Moment ist nicht mal klar, ob er mit dem ProgressMonitor zusammenhängt. Ist schwer, wenn man den Fehler nicht nachvollziehen kann, und nicht weiß, unter welchen Bedinungen er auftritt…