Newsgroup: it.comp.java
Titolo: Chiudere e comunicare con una JDialog

In Swing come si fa a fare in modo che quando viene premuto un bottone
interno a una JDialog la JDialog si chiuda?
Come si fa a comunicare dati con la JDialog?
Io ho usato una classe pubblica (ovviamente inclusa nel package) con
campi di tipo static, ci sono soluzioni piu' eleganti?
Ringrazio tutti coloro che mi risponderanno.

 ha scritto nel messaggio 
news:4b5e2ab1$0$709$5fc...@news.tiscali.it...


> Ringrazio tutti coloro che mi risponderanno.
Dall'esempio del tutorial ho letto che per chiudere la JDialog bisogna
usare il metodo dispose().
All'interno dell'actionPerformed() di quando viene premuto il bottone
di chiusura della dialogbox ho provato a scrivere "this.disponse()" ma
NON viene accettato, QUALCUNO SA IL PERCHE?
Qualche riga sopra a "jButton.addActionListener()" this.dispose()
invece VIENE ACCETTATO.
Per chiudere la JDialog ho dovuto scrivere "JDialog dialog",
"dialog=this" e a quel punto, all'interno dell'actionPerformed(),
"dialog.dispose()"
Esiste una soluzione piu' elegante?
Per la comunicazione tra la finestra principale e la JDialog ho usato
la classe pubblica "DatiGlobali" con il campo di tipo stringa dichiarato
come pubblico e statico, esiste un sistema piu' elegante per la
comunicazione tra finestre?
Di seguito riporto i tre file che compongono il programma.
********** DatiGlobali.java **********
package esempio13;
public class DatiGlobali
{
 public static String testo="Ciao";
}
********** Esempio13.java **********
package esempio13;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextArea;
public class Esempio13 extends JFrame {
 private static final long serialVersionUID = 1L;
 private JPanel jContentPane = null;
 private JButton jButton = null;
 private JTextArea jTextArea = null;
 private JButton getJButton() {
  if (jButton == null) {
   jButton = new JButton();
   jButton.setText("Chiama DialogBox");
   jButton.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
     DatiGlobali.testo=jTextArea.getText();
     ProvaDialog oggDialog=new ProvaDialog(null);
     oggDialog.setLocation(80,80);
     oggDialog.setVisible(true);
     jTextArea.setText(DatiGlobali.testo);
    }
   });
  }
  return jButton;
 }
 private JTextArea getJTextArea() {
  if (jTextArea == null) {
   jTextArea = new JTextArea();
  }
  return jTextArea;
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    Esempio13 thisClass = new Esempio13();
    thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    thisClass.setVisible(true);
   }
  });
 }
 public Esempio13() {
  super();
  initialize();
 }
 private void initialize() {
  this.setSize(300, 200);
  this.setContentPane(getJContentPane());
  this.setTitle("JFrame");
  jTextArea.setText(DatiGlobali.testo);
 }
 private JPanel getJContentPane() {
  if (jContentPane == null) {
   jContentPane = new JPanel();
   jContentPane.setLayout(new BorderLayout());
   jContentPane.add(getJButton(), BorderLayout.SOUTH);
   jContentPane.add(getJTextArea(), BorderLayout.CENTER);
  }
  return jContentPane;
 }
}
********** ProvaDialog.java **********
package esempio13;
import javax.swing.JPanel;
import java.awt.Frame;
import java.awt.BorderLayout;
import javax.swing.JDialog;
import javax.swing.JTextField;
import javax.swing.JButton;
public class ProvaDialog extends JDialog {
 private static final long serialVersionUID = 1L;
 private JPanel jContentPane = null;
 private JTextField jTextField = null;
 private JButton jButton = null;
 public ProvaDialog(Frame owner) {
  super(owner);
  initialize();
 }
 private void initialize() {
  this.setSize(300, 200);
  this.setModal(true);
  this.setTitle("ProvaDialog");
  this.setContentPane(getJContentPane());
  jTextField.setText(DatiGlobali.testo);
 }
 private JPanel getJContentPane() {
  if (jContentPane == null) {
   jContentPane = new JPanel();
   jContentPane.setLayout(new BorderLayout());
   jContentPane.add(getJTextField(), BorderLayout.NORTH);
   jContentPane.add(getJButton(), BorderLayout.SOUTH);
  }
  return jContentPane;
 }
 private JTextField getJTextField() {
  if (jTextField == null) {
   jTextField = new JTextField();
  }
  return jTextField;
 }
 JDialog dialog; // <--- creata per chiudere la finestra
 private JButton getJButton() {
  if (jButton == null) {
   jButton = new JButton();
   jButton.setText("Chiudi la dialogbox");
   dialog=this; // <--- dialog punta a this
   jButton.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
     // Chiusura della finestra
     DatiGlobali.testo=jTextField.getText();
     dialog.dispose(); // <--- chiude
    }
   });
  }
  return jButton;
 }
}

Il this non accetta dispose perche' eri dentro una inner class
(ActionListerer) e pertanto il this si riferisce ad essa.
Per chiamare il this giusto devi fare: MiaDialog.this su di esso ci
potrai invocare il metodo dispose.


Grazie della risposta.
Riguardo alla comunicazione tra la finestra principale e la JDialog?
C'e' una soluzione piu' elegante che usare i campi dichiarati come
"static" di una classe pubblica?


Sul tutorial (che ti e' stato linkato) c'e' scritto come fare.
Ciao Jack

 Sul tutorial (che ti e' stato linkato) c'e' scritto come fare.
Ho letto il tutorial ma non riesco a trovare nulla, qualcuno che sa la
soluzione me la dice?


Ciao bracco, cosï¿œ di getto ti direi di mettere la variabile come 
privata, e sulla classe a cui devi passare i dati crearti in metodo che 
accetti un parametro di tipo stringa e poi salvarteli su quella classe.