Ayuda con Generacion de Eventos

lordpancho
03 de Septiembre del 2009
Hola. como todo novato que recien se embarca en programacion java tengo muchos problemas. Estoy haciendo un programa donde genero un jpanel como ventana y luego desde el programa principal lo llamo a traves de un Jdialog (o en otros caso desde un jinternal frame, para el fin es lo mismo). El tema se me presenta a la hora de programar el evento de cancelar la ventana ya que no se de que forma hacer para que desde la clase panel el boton cancelar cierre el jdialog en la clase principal.

Aca les pongo el codigo:
Programa principal:
[QUOTE]import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.LayoutManager;

import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;



public class Principal extends JFrame {

private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JButton jButton = null;
private JDialog dialogo = new JDialog(this,"Hola",true);

/**
* This method initializes jButton
*
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("Llamado a la siguiente Ventana");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
llamada();-->llamo al JDialog
}
});
}
return jButton;
}

private void llamada(){
Ventana vent = new Ventana(); -->Instancia de mi ventana
dialogo.add(vent);--> lo adhiero
dialogo.setVisible(true);
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Principal thisClass = new Principal();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}

/**
* This is the default constructor
*/
public Principal() {
super();
initialize();
}

/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}

/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJButton(), BorderLayout.NORTH);
}
return jContentPane;
}

}[/QUOTE]

Ventana
[QUOTE]import java.awt.GridBagLayout;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Rectangle;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JLabel;
import java.awt.Dimension;

public class Ventana extends JPanel {

private static final long serialVersionUID = 1L;
private JButton jButton = null;
private JButton jButton1 = null;
private JLabel jLabel = null;

/**
* This is the default constructor
*/
public Ventana() {
super();
initialize();
}

/**
* This method initializes this
*
* @return void
*/
private void initialize() {
GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
gridBagConstraints2.gridx = 0;
gridBagConstraints2.gridwidth = 2;
gridBagConstraints2.gridy = 0;
jLabel = new JLabel();
jLabel.setText("Esta es una ventana comun");
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
gridBagConstraints1.insets = new Insets(0, 0, 0, 0);
gridBagConstraints1.gridy = 1;
gridBagConstraints1.ipadx = 0;
gridBagConstraints1.ipady = -2;
gridBagConstraints1.gridx = 1;
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.insets = new Insets(0, 0, 0, 0);
gridBagConstraints.gridy = 1;
gridBagConstraints.ipadx = 0;
gridBagConstraints.ipady = -1;
gridBagConstraints.gridx = 0;
this.setSize(232, 93);
this.setLayout(new GridBagLayout());
this.add(getJButton(), gridBagConstraints);
this.add(getJButton1(), gridBagConstraints1);
this.add(jLabel, gridBagConstraints2);
}

/**
* This method initializes jButton
*
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("Aceptar");
}
return jButton;
}

/**
* This method initializes jButton1
*
* @return javax.swing.JButton
*/
private JButton getJButton1() {
if (jButton1 == null) {
jButton1 = new JButton();
jButton1.setText("Cancelar");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.exit(0);--->¿como hago para poner dispose?
}
});
}
return jButton1;
}

} // @jve:decl-index=0:visual-constraint="10,25"[/QUOTE]

Como veran lo que quiero hacer es poner Dispose_on_close en el boton cancelar del panel para que este cierre el JDialog de donde es llamado.
Se me ocurrio alguna forma de delegar, pero he estado probando y no la encuentro. y me estoy sacando los cesos tratando de resolver este problema. Alguno me puede ayudar?

Leo
03 de Septiembre del 2009
Hola, lo que podés hacer para delegar el cerrado de la ventana padre es usar lo que se llama observador.
Haces una clase ObservadorVentana que quedaria asi:

public class ObservadorVentana {


private JFrame frame;

public ObservadorVentana(JFrame frame) {
this.frame = frame;
}

public void cerrar(){

frame.dispose();
}
}

entonces al momento de instanciar la clase Ventana, se le pasa al constructor de Ventana, el ObservadorVentana haciendo new ObservadorVentana(this) en la clase Principal.

En el listener del boton Cancel cuando se presiona, pones en el codigo observadorVentana.cerrar(), que automaticamente le informa al frame que se cierre. Es una manera de desacoplar.

Podes visitar http://www.runit.com.ar y ver mas ejemplos!