Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Java]Databinding bij collections

Pagina: 1
Acties:

  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Goeiedag,

Ik ben sinds kort bezig met Data Binding in Java. Ik gebruik liever geen Data Binding framework zoals Eclipse Data Binding of JGoodies, maar ik doe het liever manueel (hoewel dat dit voor mijn vraag, volgens mij, niets uit maakt).

Voor een methode in mijn data-object die gewoon een enkele property verandert is de code die ik moet plaatsen om een property-change event te genereren simpel:

Java:
1
2
3
4
5
6
    public void setFoo(int foo) {
        int oldValue = getFoo;
        
        this.foo = foo;
        firePropertyChange("foo", oldValue, foo);
    }

Deze code is dus correct.

Maar als er een verzameling van object veranderd wordt, dan kan ik dat niet meer op deze manier doen:

Java:
1
2
3
4
5
6
7
8
    HashSet<Foo> FooCollection = new HashSet<Foo>(); 

    public void addFoo(Foo foo) {
        int oldValue = FooCollection;
        
        FooCollection.add(foo);
        firePropertyChange("foo", oldValue, FooCollection);
    }


In bovenstaande code zou (oldValue == FooCollection), dus de property change zou niet uitgevoerd worden.

Hoe moet ik dit oplossen? Waarschijnlijk bestaat hiervoor een totaal andere constructie, maar ik vind maar niet hoe het moet.

Alvast erg bedankt!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 22:48
Alle klassen in het collections framework hebben een copy-constructor die je zou kunnen gebruiken.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 30-11 13:40

Robtimus

me Robtimus no like you

Alleen is dat wel geheugenintensiever, en dat alleen maar om een property wijziging goed door te geven.

Is het wellicht een idee een eigen listener class te definieren, inclusief eigen event object? Dan kun je events doorgeven met als type "added" of "removed", met als argument het object dat is toegevoegd / verwijderd.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 22:48
IceManX schreef op maandag 10 september 2007 @ 21:16:
Alleen is dat wel geheugenintensiever, en dat alleen maar om een property wijziging goed door te geven.

Is het wellicht een idee een eigen listener class te definieren, inclusief eigen event object? Dan kun je events doorgeven met als type "added" of "removed", met als argument het object dat is toegevoegd / verwijderd.
Duur kan het zeker zijn, maar als ie zijn huidige manier van werken persé wil handhaven is het wel een oplossing die snel en eenvoudig geïmplementeerd is. Het is zeker niet de meest optimale oplossing wat resources betreft.

  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Inderdaad, de collectie eerst clonen voordat ik ze aanpas is geen optie. Dat zou teveel overhead geven. Maar ik kan me niet voorstellen dat hier binnen Java niets voor voorzien is, als er voor 'gewone' properties wel zo'n systeem is...

Zou het kunnen dat dergelijke functionaliteit al ingebouwd is in de Set objecten uit Java en dat het mogelijk is om een bepaalde listener aan deze objecten te koppelen?

  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Ik denk dat ik een goed voorbeeld heb gevonden van hoe ik dit zou kunnen oplossen:

http://www.eclipse.org/ar...-viewer/table_viewer.html

Ik heb het nog niet volledig doorgenomen, maar op het eerste zicht is dit wel wat ik moet hebben.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 30-11 13:40

Robtimus

me Robtimus no like you

Voor zover ik het doorheb is dat een soort ListModel met ListDataListener. Deze laatste heeft methods contentsChanged, intervalAdded en intervalRemoved. Daarmee zou je kunnen doen wat je wilt, maar dan moet je wel van je HashSet af aangezien deze geen indexing heeft.

Nogmaals, ik zou zelf een soortgelijke listener schrijven:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CollectionEvent extends EventObject
{
    // fields, constructors en methods die je de source (set) en toegevoegde item(s) aankunnen
}

interface CollectionListener extends EventListener
{
    public void itemAdded(CollectionEvent e);

    public void itemRemoved(CollectionEvent e);
}

abstract class CollectionAdapter implements CollectionListener
{
    public void itemAdded(CollectionEvent e) {}

    public void itemRemoved(CollectionEvent e) {}
}

Eventueel maak je daar itemsAdded en itemsRemoved van.

Zoiets had trouwens inderdaad wel in het Collections framework mogen zitten, al geeft het wellicht iets teveel overhead.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 22:48
Schrijf een decorator API voor het collections framework die de collection classes wrapped in een observer/observable jasje, noem het de Java Observable Collections API en schop je creatie de wereld in! Waarom? Omdat het kan! 8)

:X

  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Ik heb uiteindelijk toch mijn eigen methodes geschreven. Ik heb enerzijds een subklasse van HashSet gemaakt die een soort EventListener kan registreren, die opgeroepen wordt wanneer er een object toegevoegd of verwijderd wordt.

Anderzijds bevat de EventListener ook een methode objectChanged die gebruikt moet worden wanneer er een object van een HashSet wordt aangepast.

Ik denk dat dit is wat IceManX bedoelt?

Ik heb het nog niet grondig kunnen testen, maar voorlopig lijkt het perfect te werken.

Bedankt voor de hulp!
Pagina: 1