24. maj 2001 - 12:40Der 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.
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...
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å.
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...
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 }
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.
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
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 :-)
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]); } } }
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?
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.
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.
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.