Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[SWING] EventDispatchThread

1 view
Skip to first unread message

Daniel Kräcker

unread,
Jul 13, 2006, 7:50:16 AM7/13/06
to
Mal wieder eine Frage zum Thema ...

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

Ingo R. Homann

unread,
Jul 13, 2006, 8:03:42 AM7/13/06
to
Hi,

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 Kräcker

unread,
Jul 13, 2006, 8:19:47 AM7/13/06
to
>
> Was heisst "nix zu sehen"? Schwarzer Bildschirm?
>
"nix zu sehen" im Sinne von ... Der Fehler wird nicht angezeigt, die
Anwendung arbeitet sauber weiter ( so wie gewünscht bzw. gedacht )...

Daniel

Sascha Broich

unread,
Jul 13, 2006, 8:55:17 AM7/13/06
to
On 13 Jul 2006 04:50:16 -0700, Daniel Kräcker wrote:

> 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.

Daniel Kräcker

unread,
Jul 13, 2006, 9:04:09 AM7/13/06
to
> Das kann IMHO nur passieren, wenn zwischenzeitlich ein anderer Thread am UI
> rumschraubt.

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

Ingo R. Homann

unread,
Jul 13, 2006, 9:09:30 AM7/13/06
to
Hi,

Klingt nach einem Fall für SwingUtils.invokeLater().

Ciao,
Ingo

Sascha Broich

unread,
Jul 13, 2006, 9:29:18 AM7/13/06
to

SwingUtilities.invokeLater()

Aber ein "synchronized(JTree#getTreeLock())" könnte auch schon helfen.

Ralf Ullrich

unread,
Jul 13, 2006, 9:49:06 AM7/13/06
to
Sascha Broich wrote:

>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

Michael Rauscher

unread,
Jul 13, 2006, 12:49:41 PM7/13/06
to
Hi,

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

Message has been deleted

Sascha Broich

unread,
Jul 14, 2006, 2:37:10 AM7/14/06
to
On 13 Jul 2006 16:53:35 GMT, Stefan Ram wrote:

> 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)

Michael Rauscher

unread,
Jul 14, 2006, 3:23:23 AM7/14/06
to
Stefan Ram schrieb:

> 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?
>

Ok, ich habe mich unglücklich ausgedrückt. Natürlich ging mein Dank an
Ralf für den Link auf den Artikel :)

Gruß
Michael

0 new messages