Avatar billede faceorbit Nybegynder
23. maj 2001 - 16:28 Der er 15 kommentarer og
2 løsninger

ItemListener, itemStateChanged

Jeg har tilføjet 2 JComboBox til et view -- ændringer i combo boxene dvs. valg af item bliver reflekteret i en 2 attributter i en model. Attributterne er henholdsvis produktType og produktType2.

Koden for de to itemStateChanged...

    void jcbMaxKredit_itemStateChanged(ItemEvent e) {
   
        ProduktType p = (ProduktType) jcbMaxKredit.getSelectedItem();
        model.getAftale().setProdukttype(p);
    }

void jcbMaxLaan_itemStateChanged(ItemEvent e) {
        model.getAftale().setProdukttype2((ProduktType) e.getItem());
    }

Koden er lidt forskellig, men der er for at teste på performance.

Imidlertid er jeg havnet i den uheldige situation, at at når der indtræffer events i den ene combo box, bliver begge attributter i modellen opdateret. Dvs. ændringer til jcbMaxKredit sætter både produktType og produktType2. Jeg har testet set og get metoderne, og de sætter de rigtige attributter.




Avatar billede phylox2 Nybegynder
23. maj 2001 - 16:32 #1
Hvorfor sætter du så ikke en seperat listener på hver af de to JComboBoxe ??
Avatar billede phylox2 Nybegynder
23. maj 2001 - 16:35 #2
class test implements ActionListener
{
  public void test()
  {
    JComboBox 1 = new JComboBox();
    JComboBox 2 = new JComboBox();

    1.addActionListener( this );
    2.addActionListener( this );
  }

  public voic actionPerformed( Action Event e )
  {
    if ( e.getSource == 1 )
    {
    // den ene
    }
    elseif ( e.getSource == 2 )
    {
      // den anden
    }
  }
}

kun en skitse


Avatar billede faceorbit Nybegynder
23. maj 2001 - 16:36 #3
Jeg er ikke helt med på hvad du mener -- her er koden for tilføjelse af ItemListener\'s

jcbMaxLaan.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                jcbMaxLaan_itemStateChanged(e);
            }
        });



jcbMaxKredit.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                jcbMaxKredit_itemStateChanged(e);
            }
        });
Avatar billede faceorbit Nybegynder
23. maj 2001 - 16:37 #4
OK -- nu har jeg valg at bruge ItemListener, men jeg har jo i princippet gjort det samme som du foreslår
Avatar billede phylox2 Nybegynder
23. maj 2001 - 16:41 #5
jcbMaxLaan.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(ItemEvent maxlaan) {
                jcbMaxLaan_itemStateChanged(maxlaan);
            }
        });



jcbMaxKredit.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(ItemEvent maxkredit) {
                jcbMaxKredit_itemStateChanged(maxkredit);
            }
        });


Har du forsøgt at ændre på ItemEvent \"variabel\" navn ??
Avatar billede faceorbit Nybegynder
23. maj 2001 - 16:57 #6
Så vidt jeg kan se har de forskelligt scope, så hvordan skulle det kunne hjælpe?
Avatar billede phylox2 Nybegynder
23. maj 2001 - 16:59 #7
Har du noget kode, som man kunne teste med?
Avatar billede faceorbit Nybegynder
23. maj 2001 - 17:06 #8
Det kan desværre ikke lade sig gøre :(
Avatar billede logical Nybegynder
23. maj 2001 - 18:39 #9
Det vil normalt ikke være muligt det du beskriver, så jeg bliver lidt i tvivl om du ved et uheld har fået forkerte referencer det forkerte sted hen (ala jcbMaxKredit = jcbMaxLaan), for så ville det være det samme.

Tag getSource() fra dit event, og se om de kommer fra samme komponent.
Avatar billede faceorbit Nybegynder
24. maj 2001 - 11:33 #10
Jeg har testet ved at tilføje følgende:

    void jcbMaxKredit_itemStateChanged(ItemEvent e) {       
        Object s = e.getSource();
        System.out.println(\"max KREDIT event source = \"+s);
        System.out.println((kc++)+\"-------------------------------\");
       
        model.getAftale().setProdukttype((ProduktType) e.getItem());
    }

    void jcbMaxLaan_itemStateChanged(ItemEvent e) {
        Object s = e.getSource();
        System.out.println(\"max LÅN    event source = \"+s);
        System.out.println((lc++)+\"-------------------------------\");

        model.getAftale().setProdukttype2((ProduktType) e.getItem());
    }

variablene kc og lc er counters.
Jeg kan se at når jeg ændre i combo boxen jcbMaxKredit bliver
jcbMaxKredit_itemStateChanged kaldt og kun den.

når jeg ændre i combo boxen jcbMaxLaan bliver
jcbMaxLaan_itemStateChanged kaldt og kun den.

Dvs. hver combo box genererer et specifikt event.
Jeg skriver mit event object ud, og kan se at det er
det rigtige item i den rigtige combo box der bliver valgt.
Avatar billede logical Nybegynder
24. maj 2001 - 16:57 #11
Hvis du så stadig får sat både produkttype og produkttype2 hvergang, må dine problemer ligge i dit aftaleobject. (Jeg mener, metoderne ovenfor siger du selv er ok).

Avatar billede faceorbit Nybegynder
24. maj 2001 - 20:10 #12
private BizObjReference produkttype  = new BizObjReference(this, \"produkttype\");
private BizObjReference produkttype2 = new BizObjReference(this, \"produkttype\");


public void setProdukttype(ProduktType type) {
    try{
        produkttype.setBO(type);
    } catch(BusinessRuleException e) {
        e.printStackTrace();
    }
}
   
public void setProdukttype2(ProduktType type) {
    try {
        produkttype2.setBO(type);
    } catch(BusinessRuleException e) {
        e.printStackTrace();
    }
}

Her er de vaske ægte set metoder -- de burde virke.
Avatar billede logical Nybegynder
25. maj 2001 - 09:12 #13
Jamen, har du kigget på hvor de metoder bliver kaldt fra?

Du kan evt. (hvis du er tilfreds med system.out) lave en:

Thread.currentThread().dumpStack();

Så får du en exception udskrevet på skærmen med et stack trace, om hvilke metoder, der har kaldt hvilke. De burde jo i princippet være isoleret, i forhold til dit oprindelige problem, men.
Avatar billede faceorbit Nybegynder
25. maj 2001 - 10:06 #14
metoderne bliver kaldt fra disse to, der implementere itemStateChanged
for de to forskellige combo box\'e

void jcbMaxKredit_itemStateChanged(ItemEvent e) {       
    model.getAftale().setProdukttype((ProduktType) e.getItem());
}

void jcbMaxLaan_itemStateChanged(ItemEvent e) {
    model.getAftale().setProdukttype2((ProduktType) e.getItem());
}

Jeg tror imidlertid jeg dropper denne implementering og forsøger mig
med actionPerformed --
Avatar billede logical Nybegynder
25. maj 2001 - 10:38 #15
Jamen, prøvede du at kigge på et stacktrace, fordi med de to kodestumper, du har leveret er der ingen fejl...?

Og et spørgsmål i forbindelse med dine produktklasser. Jeg kender selvfølgelig ikke BizObjReference objekter, men du opretter to på nøjagtig samme måde. Hvis det er en wrapper over for et andet lag, kan man spekulere på om de to new metoder rent faktisk relaterer til det samme på det bagved liggende system. Er det to unikke objekter med separat lager, og hvis de refererer til bagvedliggende objekter er disse så fælles eller en ren deep copy.

Jeg kan godt foranledes til at tro noget omkring det sidste. Et tilsvarende problem har jeg nemlig haft tidligere.
Avatar billede faceorbit Nybegynder
26. maj 2001 - 19:21 #16
logical>> Nu må jeg rødmende erkende at jeg ikke er helt stiv i det
med stack trace :( jeg burde nok have lært at gå før jeg begyndte at
løbe, men sådan skulle det ikke være.

En white box test har afsløret at metoderne bliver kaldt som de skal,
data bliver hentet fra GUI\'en som de skal, de havner nogen gange rigtigt
i datamodellen, men bliver altid gemt forkert i databasen. Derfor blev
jeg nødt til at undersøge JFrameworket (desværre nåede jeg ikke at se
dit svar 10:38)

Da min datamodel nedarver fra en BizObj model, der både
er i stand til at reflektere simple attributter, men også en til mange
relationer vha. containere, var det selvfølgelig oplagt at undersøge om
frameworket \'havde noget imod\' at to referencer blev \'hardcoded\' istedet
for at blive repræsenteret som en container.

Det viste sig at når man gør det fortolker JFrameworket det fejlagtigt,
og sætter den første reference til at pege på sidste references \'lager rum\'.
Hvis man vil have mere end en reference til den samme type objekt er man
altså nødt til at bruge en container.



Grundet \'samtidigheds problemer\' i vores ideer håber jeg det er ok vi deler?
Avatar billede logical Nybegynder
26. maj 2001 - 21:43 #17
Fint for mig, jeg har bare det, at jeg hader problemer, og jeg vil løse dem.

Det har givet mig en del øvelse med tiden, så det plus stor viden om java giver ret gode muligheder for at identificere problemer.

De største \"hurdles\", jeg arbejder med, er fejl i application servere og race conditions i flertrådssystemer. Der er det lidt sværere at finde fejl :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester