Avatar billede chrishunter Nybegynder
02. juli 2009 - 21:08 Der er 9 kommentarer og
1 løsning

returnere værdier fra en JDialog

Som det fremgår af http://www.eksperten.dk/spm/878974#reply_7408123, er jeg i Groovy (som er An agile dynamic language for the Java Platform, og som i det store og hele er som Java) ved at lave en pop-up dialog med nogle textFields, der skal fodres med startværdier. Hovedprogrammet skal så vente til der klikkes på OK (eller Cancel), hvorefter det går videre med de evt. nye værdier i textFields'ne.

Og jeg er nået frem til noget i denne retning:

...

class MyDialog extends JDialog implements ActionListener {
    ...

    /* constructor */
    public TaskDialog(param1, ... ) {
        ...
        setModal (true)
     
        def input1Field = new TextField ( param1);
        input1Field (...);
        add( input1Field );
     
        def input2Field = new TextField ( param1);
        ...

        def okButton = new Button( "OK");
        ...
        def cancelButton = new Button( "Cancel");
        cancelButton.setBounds (...);
        add( cancelButton );
        cancelButton.addActionListener( this )

    }
 
    public void actionPerformed ( ActionEvent event ) {
        String label = event.getActionCommand();
     
        if (label.equals("OK")) {
            //gør noget afsluttende
            setModal(false)
            dispose();
        } else {
            setModal(false)
            dispose();
        }
    }

}

...

def frame = new MyDialog()
...

Og jeg kan finde masser eksempler på, hvordan man laver dialoger med listeners o.s.v. på Internet, men de viser alle, hvordan man ændrer noget i selvet dialogen. Så ...

Mit spørgsmål:
Hvordan returnerer jeg værdierne fra textFields'ne til det kaldende program, når der trykkes på OK?

Det skal lige nævnes, at jeg bestemt ikke er nogen haj til hverken Java eller OOP i det hele taget (men det kan den opmærksomme læser måske også godt se af min kodestil).


Venlig hilsen

Christian
Avatar billede arne_v Ekspert
02. juli 2009 - 21:39 #1
Jeg ville sende en ref til noget i resten af programmet med over i constructor til din dialog, constructor gemmer så den ref i en private instance variabel som actionPerformed så kan bruge til at kalde metoder der sætter værdier.
Avatar billede chrishunter Nybegynder
02. juli 2009 - 21:42 #2
Tak Arne, men som det fremgår, er jeg ikke en haj. Så kan du være mere specifik?
Avatar billede arne_v Ekspert
03. juli 2009 - 00:48 #3
Et Java (ikke Groovy) eksempel:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class MainFrame extends JFrame implements ActionListener {
    private JTextField tf;
    public MainFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        setTitle("Dialog demo");
        tf = new JTextField("**********");
        getContentPane().add(tf, BorderLayout.NORTH);
        getContentPane().add(new JLabel("This is a test"), BorderLayout.CENTER);
        JButton btn = new JButton("Open dialog");
        btn.addActionListener(this);
        getContentPane().add(btn, BorderLayout.SOUTH);
        setSize(400, 400);
    }
    public void setTF(String s) {
        tf.setText(s);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        JDialog dia = new MyDialog(this);
        dia.setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new MainFrame();
                f.setVisible(true);
            }
        });
    }
}

class MyDialog extends JDialog implements ActionListener {
    private MainFrame mf;
    private JTextField tf;
    private JButton ok;
    private JButton can;
    public MyDialog(MainFrame mf) {
        super(mf, true);
        this.mf = mf;
        getContentPane().setLayout(new BorderLayout());
        tf = new JTextField();
        getContentPane().add(tf, BorderLayout.NORTH);
        getContentPane().add(new JLabel("This is a test"), BorderLayout.CENTER);
        ok = new JButton("OK");
        ok.addActionListener(this);
        can = new JButton("Cancel");
        can.addActionListener(this);
        JPanel p = new JPanel();
        p.setLayout(new GridLayout(1, 2));
        p.add(ok);
        p.add(can);
        getContentPane().add(p, BorderLayout.SOUTH);
        setSize(200, 200);
    }
    @Override
    public void actionPerformed(ActionEvent ev) {
        if(ev.getSource() == ok) {
            mf.setTF(tf.getText());
        }
        dispose();
    }
}
Avatar billede chrishunter Nybegynder
03. juli 2009 - 09:14 #4
Tak Arne!


Eksemplet fik jeg til at virke i Groovy ved at flytte

  JFrame f = new MainFrame();
  f.setVisible(true);

ned i bunden og altså udenfor class'erne og så slette resten af

  public static void main(String[] args) {
    ...
  }

Og udfra eksemplet har jeg nu fået dialogen til ar virke og returnere værdier ved at lave en ekstra class, der kalder den:

class MyDialogContainer {
    private param1
        ...
   
    public void setParameters(param1, ...) {
        this.param1 = param1
        ...
    }
   
    public String getParameters() {
        return param1
                ...
    }

    public showDialog(){
        TaskDialog frame = new TaskDialog(this, param1, ...);
    }
   
}

idet jeg har tilføjet endnu en parameter i constructoren; nemlig en, der referer til den kaldende class.
Jeg har også været nødt til at gøre parametrene lokale; altså noget med this.param1 = param1 o.s.v. og this.mf = mf og nogle flere ting, som fremgår af eksemplet.

Men nu virker det - om end det er noget af en gang spaghettiprogrammering og har taget meget længere tid, end jeg forestillede mig, da jeg lige skulle lave en enkel og nemmere måde at putte attributes ind i noderne i Freemind.
Avatar billede arne_v Ekspert
03. juli 2009 - 14:01 #5
Det er ikke altid at et problem som lyder simpelt forklaret på dansk kan transformeres til simpel kode.
Avatar billede chrishunter Nybegynder
08. oktober 2009 - 18:22 #6
slut
Avatar billede arne_v Ekspert
10. oktober 2009 - 19:07 #7
Og så kan man jo undre sig over at man spildte sin tid på dit spørgsmål.
Avatar billede chrishunter Nybegynder
11. oktober 2009 - 14:05 #8
Undskyld Arne, jeg kunne ikke se, du havde lagt et svar. Hvis du vil have point, er du yderst velkommen - du har fortjent dem.

Skal jeg oprette et dummy-spørgsmål?
Avatar billede chrishunter Nybegynder
11. oktober 2009 - 14:06 #9
P.S. Jeg havde bare et anfald af oprydningsiver. ;-)
Avatar billede arne_v Ekspert
11. oktober 2009 - 15:41 #10
Oprydning i game spørgsmål er godt *HVIS* man får afsluttet på en god måde.

Hvis du mener at jeg har fortjent point, så kan du oprette en "Point til ..." spørgsmål.
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