Die überwachung der änderungen an einer Sammlung
Sagen, Sie haben das folgende java-bean:
public class MyBean
{
private List<String> names = new ArrayList<String>();
public void addName(String name)
{
names.add(name);
fireNamesPropertyChange(name);
}
}
Wie würden Sie normalerweise implementieren einer Eigenschaft change-Ereignis für eine Sammlung? Versuchen Sie, und verwenden Sie die index-Eigenschaft, die scheint zu sein, mehr für arrays als Sammlungen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf Verglaste Listen Bibliothek, die Unterstützung für sichtbare Sammlungen.
Wenn ich es selbst zu tun, würde ich wahrscheinlich erstellen von benutzerdefinierten Listener-Schnittstelle mit elementsAdded, elementsRemoved Methoden, oder ähnlich 🙂 (auch je nach meine Bedürfnisse)
(HINWEIS: ich aktualisiert diesen Beitrag nach der Realisierung ein paar Fehler von meiner eigenen so ist dies nicht das original, sondern eine verfeinerte stattdessen)
Für diesen Zweck, die ich tun würde, zwei neue Schnittstellen
ListListener
undListenable
und dann würde ich eine neue Klasse erstellen, wieListenableArrayList
würde wickeln Sie jedenList
Methode mit einem Aufruf von einem (oder mehreren) entsprechenden Methoden definiert, die inListListener
. Im code würde es so etwas wie dieses:Der Grund, warum ich würd es so machen würden, dass für die Erstellung von wirklich ad-hoc-Hörer auf der fly, anstatt die Bindung des ListenableArrayList zu einigen konkreten Umsetzung. Zum Beispiel mit diesem wäre das folgende möglich:
Etwas unübersichtlich, vielleicht, aber auf der anderen Seite würde dies ermöglichen die einfache Erweiterung von Sammlungen, Sets und so weiter ziemlich leicht.
Können Sie eine Observable-Collection: https://commons.apache.org/dormant/events/apidocs/org/apache/commons/events/observable/ObservableCollection.html
Normalerweise würde ich Folgendes tun:
PropertyChangeSupport verwaltet die Zuhörer und feuert die Ereignisse in Ihrem Namen.
Durch die übergabe von null als "Alter Wert" es zwingt das Ereignis ausgelöst werden. (Es ist wahrscheinlich, dass die Hörer nicht wirklich über den alten Wert sowieso)
PropertyChangeEvent
.JDK 7+ - Lösung:
Für eine swing-GUI-event und ich würde in der Regel verwenden Sie einfach einen EventListenerList um die Arbeit zu tun für mich.
EDIT: auf das formulieren der Fragen: wie behandeln Sie Kollektionen, würde ich in der Regel verwenden Sie eine ähnliche Veranstaltung wie die Sammlungen geben, so zum Beispiel ein TreeModel Veranstaltung dauert in der Regel ein TreePath-argument, oder für etwas in eine Karte würde ich geben die Schlüssel.
Jedoch für einfache JavaBeans die häufigste ist, nehmen eine Liste/array und verwenden Sie einfach die index.
Mich deucht, Sie müssen
fireNamesPropertyAdd
,fireNamesProperyDelete
. Eine Liste der level-Benachrichtigung wird IMHO nicht funktionieren, selbst wenn es ein array und ein index Hinzugefügt wurde, wie es nicht umgehen kann, löscht. Wenn das element mit dem index geändert werden kann, müssen Sie auchfireNamesProperyChange
. Es könnte nützlich sein, index als parameter zusätzlich zu den string-Wert.Sind Sie vielleicht auf der Suche für
java.beans.PropertyChangeSupport
?Meiner Meinung nach, sollte man vermeiden
PropertyChangeEvent
.IndexedPropertyChangeEvent
ist schlimmer, und sehr selten verwendet, von Swing sowieso. Es ist besser, um einzugrenzen, Ihre Typen und Feuer einjavax.swing.event.ChangeEvent
oder ähnliches (auch wenn es nur ein AnrufRunnable
).Bestimmter Datentypen (wie Listen!), Verglaste Listen (oder gleichwertig) erwähnt in einem anderen Beitrag von Peter Štibraný scheint ein guter Weg zu gehen.