Avatar billede myplacedk Nybegynder
20. november 2003 - 08:37 Der 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;
        }
Avatar billede conrad Nybegynder
20. november 2003 - 08:57 #1
Bør du ikke splitte det op så du har en metode der laver søgeboksen

findGUI søgeboks = new findGUI();
                søgeboks.setVisible(true);

og en metode der gennem søgeboks actionListener kalder din visFindMitObjekt() i din controller klasse?
Avatar billede myplacedk Nybegynder
20. november 2003 - 09:25 #2
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?
Avatar billede conrad Nybegynder
20. november 2003 - 09:34 #3
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.
Avatar billede conrad Nybegynder
20. november 2003 - 09:39 #4
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"
Avatar billede _carsten Nybegynder
20. november 2003 - 13:53 #5
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;
        }
Avatar billede myplacedk Nybegynder
20. november 2003 - 14:09 #6
_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?
Avatar billede _carsten Nybegynder
20. november 2003 - 14:15 #7
Det er peanuts som skal omskrives, JDialog fungerer på samme måde som JFrame, den har bare lige disse udvidede muligheder.

Du skal kun extende JDialog og tilføje/omskrive findGUI's constructor, så ruller det.
Avatar billede myplacedk Nybegynder
20. november 2003 - 16:42 #8
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.
Avatar billede conrad Nybegynder
20. november 2003 - 17:32 #9
der er ikke nogen JDialog der tager en minncontroller som argument
Avatar billede _carsten Nybegynder
20. november 2003 - 17:34 #10
"MinControllerKlasse" er den klasse hvorfra du instantierer findGUI
Avatar billede conrad Nybegynder
20. november 2003 - 18:01 #11
Bare lige så vi er enige

public class findGUI extends javax.swing.JDialog{
           
            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;

            }   

            // Resterende metoder i søgeboks
        }
Avatar billede _carsten Nybegynder
20. november 2003 - 18:10 #12
Jeg forstår godt hvis forvirringen er total, så jeg kaster lige et flyvefærdigt eksempel

public class TestJDialog extends javax.swing.JFrame {
    private MyDialog dialog;
    private javax.swing.JButton jButton1;

    public TestJDialog() {
        initComponents();
        setSize(400,400);
    }
   

    private void initComponents() {
        jButton1 = new javax.swing.JButton();

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jButton1.setText("Åben dialog");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                openDialog(evt);
            }
        });

        getContentPane().add(jButton1);

        pack();
    }

    private void openDialog(java.awt.event.ActionEvent evt) {
        dialog = new MyDialog(this, true);
        dialog.show();
        System.out.println("Dialog lukket !");
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
}
Avatar billede _carsten Nybegynder
20. november 2003 - 18:14 #13
Jeg prøver lige en gang mere, bare for teste om jeg virkelig kan gøre det rigtigt - her er begge klasser


public class TestJDialog extends javax.swing.JFrame {
    private MyDialog dialog;
    private javax.swing.JButton jButton1;

    public TestJDialog() {
        initComponents();
        setSize(400,400);
    }
   

    private void initComponents() {
        jButton1 = new javax.swing.JButton();

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jButton1.setText("Åben dialog");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                openDialog(evt);
            }
        });

        getContentPane().add(jButton1);

        pack();
    }

    private void openDialog(java.awt.event.ActionEvent evt) {
        dialog = new MyDialog(this, true);
        dialog.show();
        System.out.println("Dialog lukket !");
    }
   

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   

    public static void main(String args[]) {
        new TestJDialog().show();
    }

 
}






public class MyDialog extends javax.swing.JDialog {

    public MyDialog(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        setSize(250,250);
    }
   

    private void initComponents() {
        jButton1 = new javax.swing.JButton();

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                closeDialog(evt);
            }
        });

        jButton1.setText("LUK");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                close(evt);
            }
        });

        getContentPane().add(jButton1);

        pack();
    }

    private void close(java.awt.event.ActionEvent evt) {
        closeDialog(new java.awt.event.WindowEvent(this, 0));
    }
   
    private void closeDialog(java.awt.event.WindowEvent evt) {
        setVisible(false);
        dispose();
    } 

    private javax.swing.JButton jButton1; 
}
Avatar billede _carsten Nybegynder
20. november 2003 - 18:17 #14
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å.

Håber at det nu er til at gennemskue.
Avatar billede conrad Nybegynder
20. november 2003 - 18:19 #15
ok _carsten- det gir mening - (min ide var IKKE at lade "controlleren" være en del af GUI)
Avatar billede myplacedk Nybegynder
20. november 2003 - 19:01 #16
Det var en tanketorsk fra min side, af en eller anden grund mente jeg at min controller var en JFrame.  :)

Jeg fandt en løsning. Det blev vist ikke den mest elegante løsning, men hey, det er noget nær det første gui jeg laver. ;-)

Tak for hjælpen. conrad, smider du lige et svar? Du skal da også have lidt point. ;-)
Avatar billede conrad Nybegynder
20. november 2003 - 22:33 #17
hvis du synes :)
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