Ich bekomme in meiner Swing-App folgende Fehlermeldung.
java.lang.NullPointerException
at javax.swing.plaf.basic.BasicTreeUI.isToggleEvent(Unknown Source)
at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(Unknown
Source)
at
javax.swing.plaf.basic.BasicTreeUI$MouseHandler.handleSelection(Unknown
Source)
at
javax.swing.plaf.basic.BasicTreeUI$MouseHandler.mousePressed(Unknown
Source)
at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(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)
Wann das auftritt kann ich nicht sagen, da im Vordergrund nix zu sehen
ist, die App normal weiterläuft und nur das Log vom System.err etwas
vom Fehlerfall erfährt. Hat jemand eine Idee wo man mit der
Fehlersuche beginnen könnte?
Danke i.V
Daniel
Daniel Kräcker wrote:
> java.lang.NullPointerException
> at javax.swing.plaf.basic.BasicTreeUI.isToggleEvent(Unknown Source)
> ...
> at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
> ...
>
> Wann das auftritt kann ich nicht sagen,
Ohne mich mit Swing gut auszukennen würde ich den Stacktrace so
interpretieren, dass es auftritt, wenn Du mit der Maus auf eine
Komponente (scheinbar einen JTree!?) clickst.
> da im Vordergrund nix zu sehen ist,
Was heisst "nix zu sehen"? Schwarzer Bildschirm?
> die App normal weiterläuft und nur das Log vom System.err etwas
> vom Fehlerfall erfährt. Hat jemand eine Idee wo man mit der
> Fehlersuche beginnen könnte?
Nun, ich würde suchen, wo die Komponente, auf die Du clickst,
initialisiert wird. Vermutlich wird sie nicht korrekt initialisiert.
Ansonsten könnte es hilfreich sein, eine Laufzeit-Umgebung zu verwenden,
in der Debug-Informationen vorliegen, so dass Du mal an der richtigen
Stelle in die Sourcen von "javax.swing.plaf.basic.BasicTreeUI" gucken
kannst.
Ciao,
Ingo
Daniel
> java.lang.NullPointerException
> at javax.swing.plaf.basic.BasicTreeUI.isToggleEvent(Unknown Source)
Das ist ja sehr interessant:
protected boolean isToggleEvent(MouseEvent event) {
if(!SwingUtilities.isLeftMouseButton(event)) {
return false;
}
int clickCount = tree.getToggleClickCount();
if(clickCount <= 0) {
return false;
}
return ((event.getClickCount() % clickCount) == 0);
}
Und die einzige Stelle, wo das aufgerufen wird:
> at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(Unknown Source)
/* Otherwise set the selection to just this interval. */
else if(SwingUtilities.isLeftMouseButton(event)) {
tree.setSelectionPath(path);
if(isToggleEvent(event)) {
toggleExpandState(path);
}
}
Rein theoretisch dürfte es da keine NPE geben: Sowohl "event" als auch
"tree" werden vorher schon benutzt.
Das kann IMHO nur passieren, wenn zwischenzeitlich ein anderer Thread am UI
rumschraubt.
Sascha Broich
--
Schlage nie jemand grundlos.
Ein Grund findet sich immer.
Ja ein paar Thread's sind da am werkeln. :)
Lässt sich da eventuell etwas mit "synchronized" in meinem Methoden
was machen?
Oder muss da mehr gemacht werden ?
MfG Daniel
Klingt nach einem Fall für SwingUtils.invokeLater().
Ciao,
Ingo
SwingUtilities.invokeLater()
Aber ein "synchronized(JTree#getTreeLock())" könnte auch schon helfen.
>SwingUtilities.invokeLater()
Man sollte vielleicht darauf hinweisen, dass seit Java 1.3 der bevorzugte
Weg über java.awt.EventQueue geht, denn:
Aus den Javadoc zu SwingUtilities#invokeLater():
As of 1.3 this method is just a cover for
java.awt.EventQueue.invokeLater()
Sofern Abwärtskompatibilität jenseits der 1.3er Versionen kein Thema ist,
sollte man sich von SwingUtilities#invokeXXX fernhalten.
Nachzulesen auch hier:
SWING "URBAN LEGENDS"
http://java.sun.com/developer/JDCTechTips/2005/tt0727.html#1
Aber ich fürchte das wird sich nicht mehr ausrotten lassen.
cu
Ralf Ullrich schrieb:
>
> Sofern Abwärtskompatibilität jenseits der 1.3er Versionen kein Thema
> ist, sollte man sich von SwingUtilities#invokeXXX fernhalten.
Naja, "fernhalten" finde ich etwas übertrieben. Man sollte zumindest im
Hinterkopf haben, dass in SwingUtilities (zumindest momentan) einfach
nur ein paar EventQueue-Methoden gewrapt werden.
>
> Nachzulesen auch hier:
>
> SWING "URBAN LEGENDS"
> http://java.sun.com/developer/JDCTechTips/2005/tt0727.html#1
>
> Aber ich fürchte das wird sich nicht mehr ausrotten lassen.
Äußerst interessant finde ich "Create Threads for Long Tasks From the
Event Dispatch Thread". Für mich ein sehr schönes Beispiel dafür, dass
man nie auslernt. Daher ein Dankeschön für diesen wirklich schönen
Artikel :)
Gruß
Michael
> Michael Rauscher <mich...@gmx.de> writes:
>>>http://java.sun.com/developer/JDCTechTips/2005/tt0727.html#1
>>Daher ein Dankeschön für diesen wirklich schönen Artikel (...)
>
> Dankst Du Sun für den Web-Artikel oder Ralf für seinen Usenet-Artikel?
Ich nehme an, Ralf für seinen Usenet-Artikel, ohne den er nicht auf Suns
Web-Artikel aufmerksam geworden wäre. Und Sun für den Web-Artikel.
Sascha Broich
--
Wenn in dieser Art Büro Laien Werkzeug Dilletanten gleich missbrauchen, ...
(Hans-Christoph Wirth in de.etc.sprache.deutsch)
Ok, ich habe mich unglücklich ausgedrückt. Natürlich ging mein Dank an
Ralf für den Link auf den Artikel :)
Gruß
Michael