20. november 2003 - 08:37Der er
15 kommentarer og 2 løsninger
Problemer med flere dialogbokse
Jeg fedter lidt med GUI'en til et desktop-program.
Jeg har en klasse, som styrer GUI'en. Dvs. det er den klasse, der opretter dialogbokse, og binder dem sammen med resten af programmet.
Hvad jeg ønsker: Man har en dialogboks på skærmen, boksen er oprettet af "controlleren". Man kan udfylde nogle felter, eller hente indhold fra en database. Det gør man ved at vælge "Søg". Der skal så komme en ny dialogboks, den "gamle" inaktiv så længe søge-boksen er der. Når man har fundet det man ønsker, skal søge-boksen forsvinde, data overføres til den "gamle" dialogboks, som så bliver aktiv igen. (De data der overføres er alle i ét objekt.)
Jeg vil gerne at når man trykker "Søg" i den første dialogboks, skal objektet blot kalde en metode på controlleren. Denne metode returnerer så objektet, som blev fundet i søgeboksen. (Eller null hvis der ikke blev fundet noget.)
Hvad jeg har: Jeg har lavet begge dialogbokse, og når man trykker "Søg" kommer søge-boksen frem. Problemet er, at når søge-boksen er kommet frem, fortsætter metoden i controlleren. Den venter ikke til man er færdig med søge-boksen. Dermed kan den ikke returnere et søgeresultat.
Metoden i controlleren ser nogenlunde sådan ud nu:
public MitObjekt visFindMitObjekt() { findGUI søgeboks = new findGUI(); søgeboks.setVisible(true); ... return mitObject; }
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Så i controlleren laver jeg en ActionListener, og lægger den på søgeboksen. Søgeboksen kan så fx. lægge den på en "OK" knap el. lign. Right? Hvordan kan jeg så holde styr på hvilken boks der åbnede søgeboksen? Og hvordan "disabler" jeg den, mens søgeboksen er der?
Nu kender jeg jo ikke dit design, men en måde at gøre det på var at tilføje en actionListerner i søgeboksen, og så kalde en metode i controlleren når der er trykket på søg knappen. Dermed kan din controller holde styr på hvilken state du er i.
mht til at flytte focus, så tror jeg det kommer lidt an på hvilken type din "boks" er, men formetlig vil requestFocus() på din søgeboks virke.
så din proces kunne være 1. controller opretter "udfyldboksen" 2. Hvis der trykkes søg kaldes en metode fra "udfyldboksen" actionPerfomed på controlleren 3. controlleren opretter søge boksen og flytter focus til denne 4. Der udfyldes søge kriterier etc. i søgeboksen og trykkes søg og dermed kaldes den egentlige søgefunktion i controlleren 5. når data er fundet lukkes søge boksen og data overføres og "udfyldboksen"
Din søgeboks skal extende JDialog og sættes modal, det at du gør den modal, forhindrer afvikling af kode i din controller klasse indtil JDialog'en returnerer
public class findGUI extends javax.swing.JDialog{
public findGUI(MinControllerKlasse control, boolean value){ super(control, value); }
// Resterende metoder i søgeboks }
public MitObjekt visFindMitObjekt() { findGUI søgeboks = new findGUI(this, true); søgeboks.setVisible(true); ... return mitObject; }
_carsten - det ligner præcist det jeg søger. :) Jeg vil lige lege med det senere, når jeg får bedre tid. Som det er nu, extender den JFrame. Fungerer JDialog på nogenlunde samme måde, eller skal jeg skrive en masse om?
Den dør ved linjen med super(): The constructor JDialog(MinControllerKlasse, boolean) is undefined
Jeg kan ikke lige gennemskue hvad jeg skal gøre, prøvede at caste til JFrame (som MinControllerKlasse extender), men det ville den ikke (cannot cast), og Frame (som JDialog kan tage i constructoren) var ikke bedre.
public findGUI(MinControllerKlasse control, boolean value){ super(control, value);//det her er forkert!
}
// Resterende metoder i søgeboks } Du skal nok snarere have noget a la public class findGUI extends javax.swing.JDialog{ MinControllerKlasse control; public findGUI(MinControllerKlasse c, boolean value){ super(value); this.control =c;
En JDialog tager selvfølgelig en Frame og boolean som parameter, alt efter hvad man vil. "MinControllerKlasse" var min syge måde at referere til din controller klasse på.
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.