Avatar billede faceorbit Nybegynder
24. maj 2001 - 12:40 Der er 22 kommentarer og
2 løsninger

dynamiske combo box\'e

Jeg en combo box hvis indhold er betinget af
et valg i en anden combo box.

Eks.
combo box 1:

    1: beløb i kr
    2: beløb i $
    3: beløb i £

combo box 2:

Hvis kr er valgt i combo box 1:

    1: 10.000 kr
    2: 20.000 kr
    3: 30.000 kr

Hvis $ er valgt i combo box 2:

    1: 1.200 $
    2: 2.400 $
    3: 3.600 $

og så videre.
Værdierne fra combo box 2 ligger alle i den
samme tabel, som et par:
valuta,symbol
eks: 10.000,kr
eller 1.200,$

Combo box 2. får sit indhold ved at spørge:
select * from valutaTabel
where symbol = det valgte symbol i combo box 1.

Det går også fint når GUI bliver initialiseret, men
når brugeren så ændre selektionen i combo box 1, skulle
indholdet i combo box 2 gerne ændres.

Nogen forslag til hvordan det kan gøres?
Jeg er klar over at combo box har en setModel metode,
men min source til combo box\'en er ikke en ComboBoxModel,
og jeg har ikke mulighed for at implementere den som en.

Jeg er villig til at forhandle om point\'ene :)
Avatar billede ladyhawke Novice
24. maj 2001 - 15:16 #1
Prøv at bruge et observer pattern til at infromere combo box 2 om at combo box 1 ændres...

Kig her:
http://developer.java.sun.com/developer/technicalArticles/Programming/KeepObjectsInSync/

Det har jeg brugt til at opdatere et billede hvergang der modtages et nyt...
Avatar billede faceorbit Nybegynder
24. maj 2001 - 15:16 #2
Special offer -- only thursday 500 points :)
Avatar billede ladyhawke Novice
24. maj 2001 - 15:19 #3
Kan du ikke bruge observerpattern?
Avatar billede ladyhawke Novice
24. maj 2001 - 15:24 #4
Hvis du implementerer observer pattern som angivet med linket, vil du kunne kalde repaint() når der ændres indstillinger i combo box 1 og hvis der er andre componenter der påvirkes af valgene kan de bare tilføjes som observers...
Avatar billede faceorbit Nybegynder
24. maj 2001 - 15:32 #5
En lille præcisering:

Der er ikke notificering af ændringer der er problemet --
Der bruger jeg events.

En combo box kan knyttes til en model, eller alternativt
oprettes vha. et array list:

ArrayList al1 = some arraylist;
ArrayList al2 = some other arraylist;
JComboBox jcb = new JComboBox(al1);

men array listen skal være forskellig alt efter valget
i combo box 1. Hvis jeg f.eks. vælger 1 i combo box 1
skal værdierne i combo box 2 komme fra al1, hvis jeg vælger
2 skal de komme fra al2. Men jeg kan jo ikke sige
new JComboBox(al..) hvergang der vælges en ny værdi i
combo box 1. Derfor leder jeg efter en metode til dynamisk at
ændre den liste som combo box 2 er baseret på.
Avatar billede ladyhawke Novice
24. maj 2001 - 15:39 #6
Du behøver da heller ikke lave en ny combo box hver gang du ændrer indstillingerne! Ideen i observer pattern er at hvis combo box 2 observerer combo box 1, så kan du, i den metoden du implementerer i combo box 2, skrive hvordan der skal opdateres, f.eks. ved sætte den rigtige tabel og dernæst repaint() eller hvad du nu skal bruge. Fordelen ved observer pattern er at du ikke behøver lave en ny instans for at ændre nogle componenter.... og du kan ændre indstillingerne lokalt i den componet der skal opdateres...
Avatar billede faceorbit Nybegynder
24. maj 2001 - 15:53 #8
Jeg kender godt observer pattern, men det er stadig ikke det der er
problemet. Når der sker en ændring i combo box 1, får combo box 2
det at vide:

public void comboBox1_itemStateChanged(ItemEvent e) {
    // fortæller combo box 2 at der
    // er valgt et item i combo box 1
    updateComboBox2((Koncept) e.getItem()); 
}

public void updateComboBox2(Koncept k) {
    // combo box 2\'s indhold skal nu
    // skifte fra en model til en anden
}

Hvordan skifter man indholdet i combo box 2?
Avatar billede faceorbit Nybegynder
24. maj 2001 - 15:59 #9
Som jeg skrev tidligere kan sourcen til min combo box ikke
implementeres som en ComboBoxModel og jeg vil helst ikke
implementere en ComboBoxModel mellem sourcen og GUI\'en,

Dog hvis det er den eneste måde at gøre det på efterlyser
jeg et eksempel.
Avatar billede faceorbit Nybegynder
24. maj 2001 - 16:35 #11
ladyhawke: du har givet nogle gode hints mht. til implementering
af ComboBoxModel - jeg giver spørgsmålet en dag til, hvis der ikke
er kommet nogle gode foreslag til hvordan problemet løses UDEN at
implementere en ComboBoxModel, er point\'ene dine
Avatar billede ladyhawke Novice
24. maj 2001 - 16:39 #12
Det er helt iorden, jeg tjekkede med en af mine kolleger og han mente ikke man kunne undgå Model (han har selv haft et lignende problem), men vhis du finder en anden løsning ville det jo komme flere til gavn :-)
Avatar billede logical Nybegynder
24. maj 2001 - 17:19 #13
Nu er jeg her ikke for at tage point fra ladyhawke, for det er nogenlunde rigtigt. Måden jeg ville løse det på er følgende:

En ComboBox model mellem din baseklasse og comboboxen er nødvendig (tæt koblet).
Den adder du som listener på den anden, og vupti er du med.

Et eksempel:

class DecoratorComboboxModel extends AbstractListModel implements ItemListener, ComboBoxModel {
  private MyModel model;
  private Object selected=null;
 
  public DecoratorComboboxModel(MyModel aModel, JComboBox c) {
    model = aModel;
    c.addItemListener(this);
  }

  // From ListModel
  public Object getElementAt(int index) {
    return model.get(index);
  }
  public int getSize() {
    return model.getSize();
  }

  // From ComboBoxModel
  public Object getSelectedItem() {
    return selected;
  }
  public void setSelectedItem(Object o) {
    selected = o;
  }

  // From ItemListener
  public void itemStateChanged(ItemEvent e) {
    JComboBox box = (JComboBox)e.getSource();
    model.setSelectedCurrency(box.getSelectedItem());
    fireContentsChanged(this, 0, getSize());
  }
 

}
Avatar billede trolle Nybegynder
24. maj 2001 - 17:54 #14
Kan du ikke blot fjerne alle de gamle Items i combo2 og derefter putte de nye i ?!?
Jeg forestiller mig noget så simpelt som:

        Object[] array1 = new Object[3];
    Object[] array2 = new Object[3];
    Object[] combo1array = new Object[2];
    JComboBox two; // skal selvfølgelig ini. i konstruktor...
    JComboBox one; // --||--

public void change2(int temp) {
    two.removeAllItems();
    if (temp==1){
        for (int x=0; x<array1.length; x++) {
            two.addItem(array1[x]);
        }
    }
    if (temp==2){
        for (int x=0; x<array2.length; x++) {
            two.addItem(array2[x]);
        }       
    }   
}
Avatar billede trolle Nybegynder
24. maj 2001 - 17:56 #15
Unskyld min illustration i klassiske elendige variabel navne!
Avatar billede faceorbit Nybegynder
24. maj 2001 - 18:16 #16
trolle: Det er et forsøg værd
Avatar billede trolle Nybegynder
24. maj 2001 - 18:24 #17
Jeg har fået det til at virke med arrays, og ovenstående kode...
Avatar billede faceorbit Nybegynder
24. maj 2001 - 18:47 #18
trolle: god ide. Den løser mit problem, og jeg har kun tilføjet 8 liniers
kode. Derfor har du vel gjort dig fortjent til en ganske betragtelig
andel i de 500 dask

ladyhawk: Da mit oprindelige spørgsmål gik på at UNDGÅ at implementere
en ComboBoxModel, svinger jeg til trolle, imidlertid gav du mig nogle gode
ideer til senere.

trolle: 300
ladyhawk: 200
er det en acceptabel løsning?
Avatar billede ladyhawke Novice
24. maj 2001 - 18:52 #19
OK for mig :-)
Avatar billede trolle Nybegynder
24. maj 2001 - 19:35 #20
fint!
Avatar billede faceorbit Nybegynder
24. maj 2001 - 22:28 #21
logical: ups - jeg overså dit svar, nu havde jeg imidlertid implementeret
en række MutableComboBoxModel\'ler, der ligger tæt på hvad du forslår i
funktionalitet, da jeg skal brug i alt 15 modeller og nye skal kunne til-
føjes dynamisk (via et user interface til databasen) virker det lettere
for mig at oprette modellerne lazily og så bare bruge setModel(new model)

Men jeg kigger da på om der er noget jeg kan bruge i dit svar, og så må vi
jo finde ud af noget med nogle bonus point.
Avatar billede logical Nybegynder
25. maj 2001 - 09:18 #22
Trolle havde jo selvfølgelig ret :-) skoven for bar træer, men alligevel.

Modellen deroppe, kan du bare rette til, så du videredelegerer dit selection event ned til modellen, og fyrer et contents changed bagefter. Så skulle din combobox nemlig bede om værdier igen fra modelklassen, og de ville se anderledes ud.

---
  // From ItemListener
  public void itemStateChanged(ItemEvent e) {
    JComboBox box = (JComboBox)e.getSource();
    model.setNewSelection(box.getSelectedItem());
    fireContentsChanged(this, 0, getSize());
    selected = null;
  }
Avatar billede faceorbit Nybegynder
25. maj 2001 - 10:26 #23
logical:
det jeg godt kan lide ved din decorator model er at jeg kan
uddelegere ansvaret for hvilken model en combo box har ud af
GUI\'en.

få dine point i: points til logical
Avatar billede logical Nybegynder
25. maj 2001 - 10:42 #24
Jeg kalder det nu en adapter :-)

Men tak alligevel
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