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

[SWING] JList: ListSelectionListener wird 2mal getriggert

101 views
Skip to first unread message

Thorsten Schäfer

unread,
Sep 3, 2002, 1:48:58 PM9/3/02
to
Hi,

Ich habe eine JList mit ein paar Daten. Sobald ein Wert selektiert wird soll
eine jTable entsprechend upgedatet werden (das macht die Methode
tableUpdate). Um das Verhalten zu implementieren habe ich einen
ListSelectionListener folgendermaßen eingebaut:

<CODE>
jList1.addListSelectionListener(new
javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent
evt) {
tableUpdate(evt);
}
});
</CODE>

Das Problem an der Sache: Wenn ich nun mit der Maus einen Wert auswähle wird
die Methode zwei mal aufgerufen! Hat jemand eine Idee woran das liegt?

Gruß,

Thorsten


Andreas Wollschlaeger

unread,
Sep 3, 2002, 2:40:27 PM9/3/02
to

*Warum* dem so ist, kann ich Dir nicht sagen; folgende Programmzeile am
Anfang des Listeners schafft Abhilfe:

if (evt.getValueIsAdjusting()) return;

HTH
Andreas


Christian Kaufhold

unread,
Sep 3, 2002, 2:41:19 PM9/3/02
to
Hallo!

"Thorsten Sch?fer" <eM...@thorstenschaefer.de> wrote:

> Ich habe eine JList mit ein paar Daten. Sobald ein Wert selektiert wird soll
> eine jTable entsprechend upgedatet werden (das macht die Methode
> tableUpdate). Um das Verhalten zu implementieren habe ich einen
> ListSelectionListener folgendermaßen eingebaut:

[...]

> Das Problem an der Sache: Wenn ich nun mit der Maus einen Wert auswähle wird
> die Methode zwei mal aufgerufen! Hat jemand eine Idee woran das liegt?

evt.getValueIsAdjusting()


Christian

Thorsten Schäfer

unread,
Sep 4, 2002, 3:50:37 AM9/4/02
to
Hi,

> > Das Problem an der Sache: Wenn ich nun mit der Maus einen Wert auswähle
wird
> > die Methode zwei mal aufgerufen! Hat jemand eine Idee woran das liegt?
>
> *Warum* dem so ist, kann ich Dir nicht sagen; folgende Programmzeile am
> Anfang des Listeners schafft Abhilfe:
>
> if (evt.getValueIsAdjusting()) return;

Vielen Dank, das hat geklappt. Leider verstehe ich nicht ganz, warum zwei
Events gefeuert werden. Ich habe sie mir mal ausgeben lassen und der einzige
Unterschied war valueIsAdjusting - first- und lastIndex waren exakt gleich.
Weiß vielleicht jemand warum hier zwei Events gefeuert werden? Nur so
interessehalber...

Gruß,

Thorsten


Marc Albaum

unread,
Sep 4, 2002, 11:00:45 AM9/4/02
to
Thorsten Schäfer schrieb:

> [2 Events beim ListSelectionListener]


> Weiß vielleicht jemand warum hier zwei Events gefeuert werden? Nur
so
> interessehalber...

IMHO wird das erste Event beim Deselektieren des alten Eintrags und
das
2. Event beim Selektieren des neuen Eintrags geworfen.

Gruß
Marc Albaum


Thorsten Schäfer

unread,
Sep 4, 2002, 2:00:55 PM9/4/02
to
Hi,

"Marc Albaum" <usenet...@gmx.net> schrieb:

Das klingt logisch! Vielen Dank.

Gruß,

Thorsten


Christian Kaufhold

unread,
Sep 4, 2002, 7:13:27 PM9/4/02
to
Hello!

Marc Albaum <usenet...@gmx.net> wrote:

> Thorsten Sch?fer schrieb:
>
>> [2 Events beim ListSelectionListener]
>> Wei? vielleicht jemand warum hier zwei Events gefeuert werden? Nur


> so
>> interessehalber...
>
> IMHO wird das erste Event beim Deselektieren des alten Eintrags und
> das
> 2. Event beim Selektieren des neuen Eintrags geworfen.


Nein. Immer wenn man valueIsAdjusting gesetzt hat und es zurücksetzt, wird
noch einmal ein Event über alle Ereignisse seit dem Setzen verschickt. Der
Sinn liegt darin, daß, wenn (möglicherweise) durch viele einzelne Änderungen
auch viele Events verschickt werden, nicht jeder Listener seinen Zustand
sofort anpassen muß (weil er sich ja gleich wieder ändern kann/wird), sondern
warten kann (indem er Events mit getValueIsAdjusting ignoriert), bis wieder
ein "stabiler" Zustand erreicht wird.


Christian

Marc Albaum

unread,
Sep 5, 2002, 4:16:14 AM9/5/02
to
Christian Kaufhold schrieb:
> Marc Albaum schieb:

>> IMHO wird das erste Event beim Deselektieren des alten Eintrags und
>> das 2. Event beim Selektieren des neuen Eintrags geworfen.
>
> Nein. Immer wenn man valueIsAdjusting gesetzt hat und es
zurücksetzt, wird
> noch einmal ein Event über alle Ereignisse seit dem Setzen
verschickt. Der
> Sinn liegt darin, daß, wenn (möglicherweise) durch viele einzelne
Änderungen
> auch viele Events verschickt werden, nicht jeder Listener seinen
Zustand
> sofort anpassen muß (weil er sich ja gleich wieder ändern
kann/wird), sondern
> warten kann (indem er Events mit getValueIsAdjusting ignoriert), bis
wieder
> ein "stabiler" Zustand erreicht wird.

Du hast Recht, meine erste Aussage war ein Schnellschuß, der leider
falsch war.
Da mich aber auch Deine Erklärung nicht wirklich zufriedenstellen
konnte, habe
ich mal die Sunsourcen und die Doku gewälzt:

In der zugehörigen UIKlasse zur JList
(javax.swing.plaf.basic.BasicListUI) gibt
es eine Klasse MouseInputHandler, die das Interface MouseInputListener
implementiert. In der Methode mousePressed() wird das Flag
ValueIsAdjusting
der zugehörigen JList auf true gesetzt. Weiterhin wird hier geprüft,
ob Strg
oder Shift gedrückt ist. In der Methode mouseReleased() wird das Flag
wieder auf false zurückgesetzt.

Wenn also die linke Maustaste gedrückt wird, wird ein
ListSelectionEvent
mit ValueIsAdjusting = true gefeuert und beim Loslassen der linken
Maustaste ein weiteres ListSelectionEvent mit ValueIsAdjusting =
false.

Verstehe ich offen gestanden nicht wirklich, da das einzige was
zwischen den
beiden MouseEvents passiert, das Zeichnen einer neuen Selektion ist,
sprich
eine oder mehrere Einträge der Liste werden blau unterlegt. Hat jemand
zu
diesem Thema weitere Informationen?

Gruß
Marc Albaum


Frank Zapf

unread,
Sep 5, 2002, 4:56:10 AM9/5/02
to
Marc Albaum schrieb:

Ich könnte mir folgendes vorstellen:
Das Ganze bekommt erst einen Sinn bei Mehrfachselektion, wenn die Selektion
ein längerer Vorgang ist.
Die JList muß sich natürlich nach jeder veränderten Selektion neu zeichnen,
um die neu selektierte Elemente auch selektiert darzustellen. Der User aber,
will erst nach dem Abschluß der Selektion eine Nachricht bekommen, also dann
wenn keine Shift/Ctrl Taste mehr gedrückt ist, und das Event mouseReleased()
gefeuert wird, dann ist der Selektionsvorgang beendet. Solange noch eine Shift
oder Ctrl-Taste gedrückt ist, ist zu erwarten, daß gleich noch ein Selektions-
ereignis folgt.

Gruß
Frank

Marc Albaum

unread,
Sep 5, 2002, 9:33:38 AM9/5/02
to
> Frank Zapf schrieb:

> Ich könnte mir folgendes vorstellen:
> Das Ganze bekommt erst einen Sinn bei Mehrfachselektion, wenn die
> Selektion ein längerer Vorgang ist.
> Die JList muß sich natürlich nach jeder veränderten Selektion neu
> zeichnen, um die neu selektierte Elemente auch selektiert
darzustellen.

Agreed, das WÜRDE Sinn machen...

> Der User aber, will erst nach dem Abschluß der Selektion eine
Nachricht
> bekommen, also dann wenn keine Shift/Ctrl Taste mehr gedrückt ist,
und
> das Event mouseReleased() gefeuert wird, dann ist der
Selektionsvorgang
> beendet. Solange noch eine Shift oder Ctrl-Taste gedrückt ist, ist
zu erwarten,

> daß gleich noch ein Selektionsereignis folgt.

Möglicherweise habe ich mich missverständlich ausgedrückt: das Flag
wird
bei jedem Klick auf eine Zeile der Liste mit der linken Maustaste
gesetzt. Erst
dann wird geprüft, ob eine der Modifiziertasten gedrückt wurde. Sobald
das
Ereignis mouseReleased() eintritt, wird das Flag wieder gelöscht.

Bedeutet: Wenn ich mit Hilfe der Shifttaste mehrere Einträge
selektieren will,
klicke ich auf das erste Element, halte die Shifttaste gedrückt und
klicke auf
das letzte Element meiner Selektion. Ich klicke also 2 mal, triggert 4
MouseEvents, 2 mit Flag, 2 ohne. Haut also nicht wirklich hin...

Gruß
Marc


Christian Kaufhold

unread,
Sep 5, 2002, 2:54:59 PM9/5/02
to
[Umbruch + Umlaute repariert]

Hallo!

Marc Albaum <usenet...@gmx.net> wrote:

[...]

> Wenn also die linke Maustaste gedrückt wird, wird ein ListSelectionEvent
> mit ValueIsAdjusting = true gefeuert und beim Loslassen der linken
> Maustaste ein weiteres ListSelectionEvent mit ValueIsAdjusting =
> false.
>
> Verstehe ich offen gestanden nicht wirklich, da das einzige was
> zwischen den
> beiden MouseEvents passiert, das Zeichnen einer neuen Selektion ist,
> sprich
> eine oder mehrere Einträge der Liste werden blau unterlegt. Hat jemand


-> mouseDragged

(was in BasicListUI allerdings kaputt ist)

Christian

Frank Zapf

unread,
Sep 6, 2002, 4:32:30 AM9/6/02
to
Marc Albaum schrieb:
.
.
.

> Möglicherweise habe ich mich missverständlich ausgedrückt: das Flag
> wird
> bei jedem Klick auf eine Zeile der Liste mit der linken Maustaste
> gesetzt. Erst
> dann wird geprüft, ob eine der Modifiziertasten gedrückt wurde. Sobald
> das
> Ereignis mouseReleased() eintritt, wird das Flag wieder gelöscht.
>
> Bedeutet: Wenn ich mit Hilfe der Shifttaste mehrere Einträge
> selektieren will,
> klicke ich auf das erste Element, halte die Shifttaste gedrückt und
> klicke auf
> das letzte Element meiner Selektion. Ich klicke also 2 mal, triggert 4
> MouseEvents, 2 mit Flag, 2 ohne. Haut also nicht wirklich hin...

Das ist aber wirklich blöd. Das würde ja bedeuten, daß sich deine View
auch gleich noch während des Selektionsvorhanges aktuallisiert oder
hast du da schon eine Variante gefunden, um festzustellen, wann der
der User mit der multiblen Selektion fertig ist ? (ich habe bisher
immer nur den Fall Single-Selektion gehabt)

Vordergründig sehe ich in dem Verhalten keinen Sinn. Vielleicht
hatte der Programmierer zu wenig Kaffee gedrunken ;) Schick doch
mal ne mail an's Swing-Team.

Gruß
Frank

--
Die Berühmtheit mancher Zeitgenossen
hängt mit der Blödheit
der Bewunderer zusammen.
[Heiner Geissler]

0 new messages