Synchronisation zwischen JList und ListModel

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hi,

mich würde interessieren, welche Methode/Listener/whatever aufgerufen wird, wenn im ListModel, das eine JList beobachtet, etwas neues geaddet wird, also die Methode addElement(Object element) aufgerufen wird.

Die Methode addElement() muss ja irgendwie der JList Bescheid geben, dass sie jetzt aufgerufen wurde. In der API wird leider nicht genau beschrieben, wie die interne Synchronisation zwischen einer JList und seinem ListModel funktioniert.

Ich brauche aber dringend die Methode, die aufgerufen wird, wenn etwas geaddet wird, weil ich da noch etwas dazu schreiben muss.

Ich kann nichts anfangen mit zB einem ContainerListener oder irgendwelchen Listener, die MEthoden anbieten die aufgerufen werden, wenn jetzt irgendwas mit der Liste passiert.

Was ich brauche ist nämlich nicht irgendwas (wie ComponentResized zB), sondern "es wurde ein Element in dem ListModel geaddet".

Wo finde ich diese Methode, hat Sun die quasi für den Anwender komplett gesperrt?

Falls der Sinn nicht ganz klar ist: Ich will wann immer ein neues Element im ListModel geaddet wurde, zB sowas machen wie einen kleinen Knopf aufblinken lassen, den die Liste kennt. Oder irgendwas mit dem ScrollPane machen, auf dem die Liste liegen könnte.

Sowas halt, und dafür brauch ich die Methode die immer aufgerufen wird intern, um sie zu überschreiben, halt zB:

Code:
@Override
public void methodWhichIsCalledWheneverSthIsAddedToListModel(){
         super.methodWhichIsCalledWheneverSthIsAddedToListModel();
         button.aufblinken();
         scrollPane.irgendwasMachen();
}
Hoffe ist klar, was ich mein. Wie komm ich an die Methode, oder anders gefragt: Gibt's so ne Methode überhaupt? Muss ja eigentlich, oder stell ich mir das falsch vor? Wenn es so eine Methode nicht gibt, wie schafft es dann die JList überhaupt immer neue Elemente anzuzeigen....

Danke!

PS: Achso, mir ist klar dass ich diese zusätzlichen Dinge auch gleich in die addElement() Methode des ListModels schreiben könnte, aber dann müsste das Model so Dinge wie einen Knopf kennen, und das hat damit eigentlich nix zu tun, das heisst so will ich das nicht machen.

edit:

Also habs nun mit einem ListCellRenderer gemacht, aber such noch immer nach der Methode, weil es eigentlich unnötig viel Code ist dafür extra nen eigenen ListCellRenderer zu machen..
 

Verjigorm

Top Contributor
eine ähnliche Frage habe ich grade die Woche beantwortet:

Verjigorm hat gesagt.:
Ok, hab mich jetzt mal mit der Frage kurz beschäftigt ;)

Lösung:
ListDataListener() aufs Model, mit intervalAdded(...)

Code:
		model.addListDataListener(new ListDataListener() {

			@Override
			public void contentsChanged(ListDataEvent e) {
				// TODO Auto-generated method stub
				System.out.println("changed");
			}

			@Override
			public void intervalAdded(ListDataEvent e) {
				// TODO Auto-generated method stub
				list.setSelectedIndex(model.getSize()-1); <--- hier Code einfügen
			}

			@Override
			public void intervalRemoved(ListDataEvent e) {
				// TODO Auto-generated method stub
				System.out.println("removed");
			}
			
		});

btw: es gäbe da noch mindestens 2 weitere Möglichkeiten, dies zu lösen.
 

André Uhres

Top Contributor
Hier noch eine kleine Anleitung, wie wir solche Sachen in Zukunft selber finden können.
Wir können mit Google z.B. nach jlist tutorial suchen.
Dort finden wir diesen Link:
http://java.sun.com/docs/books/tutorial/uiswing/components/list.html
Im Tutorial "How to Use Lists" finden wir dann noch
einen Link zu "How to Write a List Data Listener"
(um den Link zu finden könnten wir z.B. mit der Browsersuche nach listener suchen,
oder wir lesen den Abschnitt "Adding Items to and Removing Items from a List",
dann stossen wir auch drauf) :wink:
 

hdi

Top Contributor
@ Verjigorm:

ich weiss, dass du mir das gesagt hattest. ich hab nur nicht daran gedacht, dass ich den data listener aus der Liste raus per getModel() auf's Model adden kann. Ich war irgendwie davon überzeugt (warum auch immer) dass ich die Liste dann in der Klasse meines Models kennen muss... und das wollte ich ja nicht. Natürlich is das dann die Lösung, danke. Nochmal ^^

@ André:

Also wenn man weiss, wonach man suchen muss, findet man es immer... ich geb dir natürlich recht: ich könnte die komplette sun seite mehrmals durchlesen und bräuchte nie wieder eine frage hier stellen. aber wofür ist das forum da? ich dachte für leute, die eben nicht alles checken und, ja ich lese immer API usw, aber ich kann nicht ALLES lesen was es zu einem thema gibt, weil ich dann für jeden "dreck" tage oder wochen brauchen würde...
es gibt bei google zig dinge über Jlist, und nochmal: Die Seite die du mir geschickt hast kenne ich. Aber wenn man den Zusammenhang nicht kennt etc, dann weiss man schlichtweg nicht, dass jetzt genau der Link zum Data Listener das ist, was man will, unter den etlichen Links die es dort gibt.

also nehmt mir das nicht übel..

Problem gelöst :toll:

edit:

ne, doch nicht xD zumindest nicht für mein spezielles Vorhaben. Das Ding ist, dass intervalAdded aufgerufen wird, bevor der Eintrag in die List gemacht wird, bzw. der Eintrag kommt erst bisschen verspätet an. Das passt alles nicht so... Naja ich muss wohl oder übel mit einem SelectionListener, einem eigenen CellRenderer und einem ComponentListener arbeiten. Dann klappt alles wunderbar, ich dachte nur vllt geht das alles ohne soviel Listener etc.
 

André Uhres

Top Contributor
hdi hat gesagt.:
der Eintrag kommt erst bisschen verspätet an.
In solchen Fällen hilft oft "SwingUtilities.invokelater()".

Die Anleitung sollte nur eine Hilfe sein, wonach man suchen muss.
Der Sinn davon ist nicht, die komplette Sun Seite mehrmals durchzulesen.
Natürlich findet niemand immer selbständig alle Antworten.
Das Forum ist aber auch da, um solche Anleitungen anzubieten, die sich auf Erfahrung gründen:
Mit "Klassenname tutorial" kommt man fast immer zuerst auf das entsprechende Tutorial von Sun,
bei spezielleren Themen manchmal auch nur auf Tutorials von anderen Anbietern.
Den ListDataListener kannte ich übrigens auch nicht und ich hab auch nicht alles durchgelesen, was
auf der Seite steht, aber mit Hilfe von Inhaltsverzeichnis und Browsersuche kommen wir
oft relativ schnell ans Ziel. Wir machen dir keinen Vorwurf und stehen dir weiterhin zur Verfügung.
 

hdi

Top Contributor
Hm ich würd da gern nochmal auf dieses SwingUtilities zurückkommen.
Im Moment kann ich all die Funktionalitäten nur realisieren, wenn ich meiner JList so ziemlich jeden Listener geb, den es gibt. Ich hab hier MouseListener, ListSelectionListener, ComponentListener, und ListCellRenderer... Das is schon etwas "überladen", scheint mir zumindest so.

Leider bekomme ichs nicht richtig hin, auch nicht mit SwingUtilities.invokeLater().

Statt dem ganzen Kram wollte ich jetzt den MouseListener nehmen und einen ListDataListener :

Code:
list.getModel().addListDataListener(new ListDataListener() {

			@Override
			public void intervalAdded(final ListDataEvent e) {
    // markiert den neuesten Eintrag in der Liste und setzt den Text von einigen Labels entsprechend dem Zeug, was diese Labels über einen ListenEintrag anzeigen sollen:
				SwingUtilities.invokeLater(new Runnable() {

					@Override
					public void run() {
                                            
						if (auto.isSelected()) {

							int index = e.getIndex0();
							list.setSelectedIndex(index);
                                                        label1.setText(e.getIndex0().getMessage();
                                                        label2.setText(e.getIndex0().getTime();
						}
					}
				});

                             // Das hier zieht die ScrollBar von dem ScrollPane, in dem die Liste liegt, automatisch mit.
                         // und genau das "hinkt" eben hinterher und es klappt nicht gescheit. 
				SwingUtilities.invokeLater(new Runnable() {
					@Override
					public void run() {
						if (auto.isSelected()) {
							JScrollBar ver = scrollPane.getVerticalScrollBar();
							ver.setValue(ver.getMaximum());
						}
					}
				});
			}

Joa, also ich hab auch schon beide Teil-Funktionalitäten zusammen in ein Runnable gepackt, und auch mal EventQueue statt SwingUtilities versucht, aber ich kriegs nicht hin...
Auch invokeAndWait() habe ich versucht, aber dann geht gar nix mehr, weil ich lauter Exceptions bekomme und in der Liste überhaupt nix mehr angezeigt wird...

edit:

Wenn ich genau den gleichen Code in einen ComponentListener der JList packe, und nicht in einne DataListListener des Models der JList, dann klappt es reibungslos und superschnell.
Das ist leider keine Lösung für mich jetzt, weil ComponentListener reagiert ja nur wenn die Daten in der Liste den Rahmen sprengen und sie dann zB resized wird.. Solange das nicht passiert steht der ComponentListener sozusagen still.
Ich frag mich nur: Wenn es beim ComponentListener geht, müsste es doch auch bei einem ListDataListener klappen, oder nicht?
 

André Uhres

Top Contributor
Alle (!) Swing Komponenten-Methoden müssen auf dem EventDispatchThread laufen.
In einem Background-Thread (der Boolean "auto" lässt darauf schliessen)
können wir dazu SwingUtilities.invokeLater benutzen: das müssen wir stets genau überprüfen.
Beispiel:
Code:
Runnable updateList = new Runnable() {
    public void run() {
        System.out.println("addElement: " + element);
        //"DefaultListModel.addElement(..)" ist eine Swing Komponenten-Methode, 
        //die nicht threadsafe ist. Sie muss daher auf den EventDispatchThread geschickt werden!
        model.addElement(element);
    }
};
//wir schicken den Runnable auf den EventDispatchThread:
SwingUtilities.invokeLater(updateList);

Die beiden Methoden "SwingUtilities.invokeLater" und "EventQueue.invokeLater"
machen übrigens genau dasselbe, denn erstere ruft einfach letztere auf.
"invokeAndWait()" sollten wir nicht aufrufen, wenn wir auf dem EventDispatchThread sind:
in der Methode "intervalAdded(ListDataEvent e)" sind wir aber logischerweise auf dem EventDispatchThread!
Zum Scrollen können wir übrigens auch die Methode "JList#ensureIndexIsVisible" benutzen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Synchronisation eines kleinen Museums Java Basics - Anfänger-Themen 47
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
M Umgang mit Thread/ Synchronisation/ Deadlock-Vermeidung Java Basics - Anfänger-Themen 5
P Thread Synchronisation Java Basics - Anfänger-Themen 9
T Thread Synchronisation Java Basics - Anfänger-Themen 3
Dit_ Thread Synchronisation | Übung Java Basics - Anfänger-Themen 5
M lock notify synchronisation Java Basics - Anfänger-Themen 8
A Ausgabe immer anders, synchronisation? Java Basics - Anfänger-Themen 2
hdi statische synchronisation Java Basics - Anfänger-Themen 6
1 JList Problem : Synchronisation mit Vector klappt nicht :( Java Basics - Anfänger-Themen 6
H Synchronisation von Threads Java Basics - Anfänger-Themen 12
Kr0e Synchronisation Java Basics - Anfänger-Themen 7
G Synchronisation Java Basics - Anfänger-Themen 8
A Thread Synchronisation Java Basics - Anfänger-Themen 10
M thread synchronisation Java Basics - Anfänger-Themen 6
L Problem bei Synchronisation von Threads Java Basics - Anfänger-Themen 3
S Sockets und Synchronisation Java Basics - Anfänger-Themen 7
U Synchronisation, Thread Java Basics - Anfänger-Themen 4
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
S Unterschied zwischen Denkweisen Java Basics - Anfänger-Themen 13
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
Ras Unterschied zwischen parser xml and api xml Java Basics - Anfänger-Themen 7
X Was ist der Unterschied zwischen materialisierten und nichtmaterialisierten Attributen einer Klasse? Java Basics - Anfänger-Themen 1
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
S Längster Pfad zwischen zwei Vertices in einem Graph Java Basics - Anfänger-Themen 3
U Erste Schritte nextGaussian zwischen zwei Werten Java Basics - Anfänger-Themen 19
jhCDtGVjcZGcfzug Was ist der Unterschied zwischen diesen Quellcodes? Java Basics - Anfänger-Themen 3
rafi072001 Assoziation zwischen Musiker und Label Java Basics - Anfänger-Themen 1
I Best Practice Saubere Verbindung zwischen API und Business Layer mit DTO's Java Basics - Anfänger-Themen 2
A Parametar übergabe zwischen Methoden Java Basics - Anfänger-Themen 26
W User zwischen Optionen wählen lassen Java Basics - Anfänger-Themen 1
I Differenz zwischen LocalDateTime Java Basics - Anfänger-Themen 4
Leo_1789 Differenz ausrechnen zwischen denn idealgewicht und denn echten Gewicht Java Basics - Anfänger-Themen 7
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
P Methode die ausgibt wie viele Primzahlen es zwischen 2 und n gibt Java Basics - Anfänger-Themen 10
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
NeoLexx Zuweisungskompatibilität zwischen Vererbungsbeziehungen (Polymorphie) Java Basics - Anfänger-Themen 18
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
N Berührung zwischen Rechtecken Java Basics - Anfänger-Themen 5
Y Unterschied zwischen WindowBuilder und herkömmlichen erstellen des GUI´s? Java Basics - Anfänger-Themen 9
J Wert zwischen JFrames übergeben Java Basics - Anfänger-Themen 2
U Worin besteht der Unterschied zwischen call by reference und call by value? Java Basics - Anfänger-Themen 14
E Unterschied zwischen new und import Java Basics - Anfänger-Themen 5
J Punkt auf,über,unter oder zwischen 2 Geraden Java Basics - Anfänger-Themen 14
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
B Unterschied zwischen (List<T> a) und (T[] a) Java Basics - Anfänger-Themen 7
Dilara_K Abstand zwischen den Doppelwerten in einem Array herausfinden Java Basics - Anfänger-Themen 20
S Nach dem Herüberschieben eines Arrays zwischen 2 Frames öffnet sich das Frame nicht mehr Java Basics - Anfänger-Themen 12
D Zufallszahl zwischen 10 und 99? Java Basics - Anfänger-Themen 5
J Objektzugriff zwischen disjunkten Klassen Java Basics - Anfänger-Themen 1
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
A Methoden Unterscheid zwischen public und ohne Java Basics - Anfänger-Themen 9
X Input/Output Höchste Temperaturschwankung zwischen 2 Tagen Java Basics - Anfänger-Themen 2
Bluedaishi der Monat zwischen zwei Datumsangaben Java Basics - Anfänger-Themen 15
R Threads Pause zwischen zwei Schleifen Java Basics - Anfänger-Themen 1
Aprendiendo Unterschied zwischen Referenzvariable und Instanzvariable. Java Basics - Anfänger-Themen 2
N Unterschied zwischen Checked und Unchecked Exceptions Java Basics - Anfänger-Themen 12
S Parameterübergabe zwischen zwei Programme Java Basics - Anfänger-Themen 4
S Erste Schritte Zwischen zwei Punkten ein Minimumpkt./Maxima finden Java Basics - Anfänger-Themen 1
K Klassen Array zwischen Klassen übergeben Java Basics - Anfänger-Themen 2
Arif OOP Die Bindung zwischen einem äußeren und einem inneren Objekt Java Basics - Anfänger-Themen 2
schoenosrockos Unterschied zwischen Objekten und vererbungen Java Basics - Anfänger-Themen 1
S OOP Variablen zwischen mehreren Klassen Java Basics - Anfänger-Themen 11
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
F Klassen Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 4
J Variablen Unterschied zwischen lokalen-, Instanz-, Klassenvariablen Java Basics - Anfänger-Themen 6
N Dauer zwischen zwei LocalDateTime Objekten berechnen? Java Basics - Anfänger-Themen 4
P Ungerade Zahlen ausgeben lassen zwischen Spannweite zweier eingegeben zahlen Java Basics - Anfänger-Themen 6
V Zufallswert zwischen zwei Zahlen a und b Java Basics - Anfänger-Themen 12
H Datentypen Tage zwischen zwei Datums berechnen Java Basics - Anfänger-Themen 4
M Variable zwischen Klassen übergeben Java Basics - Anfänger-Themen 5
A attach source: Zusammenhang zwischen JAR und .class/.java Dateien? Java Basics - Anfänger-Themen 2
L Unterschied zwischen Klassen - und Instanzvarbiablen Java Basics - Anfänger-Themen 1
F Vererbung von Attributen zwischen zwei Klassen Java Basics - Anfänger-Themen 6
F Referenzen zwischen Methoden Java Basics - Anfänger-Themen 5
B Distanz zwischen zwei Punkten Java Basics - Anfänger-Themen 4
D Suche nach der Anzahl von Zonen zwischen zwei Punkten Java Basics - Anfänger-Themen 2
G Zugriff zwischen Klassen Java Basics - Anfänger-Themen 15
S Funktion die mir fuer einen String eine Zahl zwischen 0.0 und 1.0 zurueckliefert..? Java Basics - Anfänger-Themen 9
S Unterschiede zwischen equals und contains Java Basics - Anfänger-Themen 2
S Leerzeichen zwischen zwei Zeichen im String entfernen Java Basics - Anfänger-Themen 19
N Werte zwischen Klassen austauschen Java Basics - Anfänger-Themen 1
M Unterschied zwischen Classpath eines Eclipse Projektes und dem CLASSPATH? Java Basics - Anfänger-Themen 3
Thallius Best Practice Events zwischen eigenen Klassen Java Basics - Anfänger-Themen 2
A if-Anweisung zwischen zwei Punkten Java Basics - Anfänger-Themen 1
S Erste Schritte TAB-Wechsel zwischen TextFields Java Basics - Anfänger-Themen 1
B Relativer Pfad zwischen zwei Files Java Basics - Anfänger-Themen 2
M Drag & Drop - Interaktion zwischen Java und dem OS Java Basics - Anfänger-Themen 1
S Erste Schritte Tage zwischen 2 Daten berechnen Java Basics - Anfänger-Themen 6
Z Differenz zwischen 2 Daten berechnen, ohne importiere Funktionen! Java Basics - Anfänger-Themen 10
A Datum zwischen zwei Daten berechnen und in Tagen anzeigen Java Basics - Anfänger-Themen 4
D Unterschied zwischen double und Double Java Basics - Anfänger-Themen 4
Q Unterschied zwischen static und keinem Modifier Java Basics - Anfänger-Themen 15
K Unterschied zwischen Jar, war und ear Dateien Java Basics - Anfänger-Themen 3
S Problem bei Kollision zwischen Array-objekten! Java Basics - Anfänger-Themen 2
M Länge der Strecke zwischen zwei Punkten Java Basics - Anfänger-Themen 10
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
T zwischen den Strings soll ein plus(+) stehen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben