Como ya lo dijeron, no se recomienda tener más de 2 frames por aplicación. En lugar de ello, las demás ventanas serán hijas del frame principal y se presentarán en forma de cajas de diálogos modales o no modales.
Ahora bien, existen 3 categorías de cajas de diálogo:
- PREDEFINIDAS: Creadas usando lo métodos estáticos de la clase JOptionPane de la JFC. Entre dichos métodos están: showMessageDialog, showInputDialog, showConfirmDialog, etc. Todos ellos tienen un primer parámetro que viene a ser la referencia al objeto Component sobre el que se visualiza la caja, aunque también dicho parámetro puede ser null y en ese caso se utiliza el marco por omisión (normalmente el Escritorio)
Un pequeño ejemplo:
| Código: | import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JFrame
{
private JButton btnMensaje;
private JButton btnEntrada;
private JButton btnConfirma;
private JLabel lblNombre;
public Test()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Probando Diálogos predefinidos");
this.setSize(new Dimension(400, 250));
btnMensaje = new JButton("Saludar");
btnEntrada = new JButton("Ingresar mi nombre");
btnConfirma = new JButton("Salir");
lblNombre = new JLabel();
Container contenedor = this.getContentPane();
lblNombre.setHorizontalAlignment(SwingConstants.CENTER);
lblNombre.setFont(new Font("Arial", Font.BOLD, 16));
lblNombre.setForeground(Color.BLUE);
JPanel panelNorte = new JPanel();
panelNorte.setLayout(new FlowLayout());
panelNorte.add(btnMensaje);
panelNorte.add(btnEntrada);
panelNorte.add(btnConfirma);
contenedor.add(panelNorte, BorderLayout.NORTH);
contenedor.add(lblNombre, BorderLayout.SOUTH);
// Manejando eventos
ActionListener al = new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
Object obj = evt.getSource();
if (obj == btnMensaje)
btnMensajeActionPerformed(evt);
else if (obj == btnEntrada)
btnEntradaActionPerformed(evt);
else if (obj == btnConfirma)
btnConfirmaActionPerformed(evt);
}
};
btnMensaje.addActionListener(al);
btnEntrada.addActionListener(al);
btnConfirma.addActionListener(al);
}
private void btnMensajeActionPerformed(ActionEvent evt)
{
// Centro del marco padre
JOptionPane.showMessageDialog(this, "Hola, soy un cuadro modal", "Saludo", JOptionPane.INFORMATION_MESSAGE);
}
private void btnEntradaActionPerformed(ActionEvent evt)
{
// Centro del marco por omisión
String nombre = JOptionPane.showInputDialog(null, "Ingrese su nombre por favor");
if (nombre != null && !nombre.isEmpty())
lblNombre.setText("Hola, " + nombre);
}
private void btnConfirmaActionPerformed(ActionEvent evt)
{
int respuesta = JOptionPane.showConfirmDialog(this, "¿Está seguro que desea salir?", "Confirmar salida", JOptionPane.YES_NO_OPTION);
if (respuesta == 0)
System.exit(0);
}
public static void main(String[] args)
{
new Test().setVisible(true);
}
} |
El otro tipo de diálogos es:
- ESTÁNDAR. Son cajas muy comunes como abrir o Guardar. Ambas proporcionadas por la clase JFileChooser. Ahora que lo recuerdo también existe la caja de Color proporcionada por la clase JColorChooser:
Realizando una pequeña modificación al anterior:
| Código: | import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class Test extends JFrame
{
private JButton btnAbrir;
private JButton btnGuardar;
private JButton btnColor;
private JLabel lblRuta;
Container contenedor;
public Test()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Probando Diálogos Estándar");
this.setSize(new Dimension(400, 250));
btnAbrir = new JButton("Abrir...");
btnGuardar = new JButton("Guardar");
btnColor = new JButton("Color...");
lblRuta = new JLabel();
contenedor = this.getContentPane();
lblRuta.setHorizontalAlignment(SwingConstants.CENTER);
JPanel panelNorte = new JPanel();
panelNorte.setLayout(new FlowLayout());
panelNorte.add(btnAbrir);
panelNorte.add(btnGuardar);
panelNorte.add(btnColor);
contenedor.add(panelNorte, BorderLayout.NORTH);
contenedor.add(lblRuta, BorderLayout.SOUTH);
// Manejando eventos
ActionListener al = new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
Object obj = evt.getSource();
if (obj == btnAbrir)
btnAbrirActionPerformed(evt);
else if (obj == btnGuardar)
btnGuardarActionPerformed(evt);
else if (obj == btnColor)
btnColorActionPerformed(evt);
}
};
btnAbrir.addActionListener(al);
btnGuardar.addActionListener(al);
btnColor.addActionListener(al);
}
private void btnAbrirActionPerformed(ActionEvent evt)
{
JFileChooser selectorArchivo = new JFileChooser();
selectorArchivo.setFileSelectionMode(JFileChooser.FILES_ONLY);
selectorArchivo.setCurrentDirectory(new File("."));
int resultado = selectorArchivo.showOpenDialog(this);
if (resultado == JFileChooser.APPROVE_OPTION) {
String ruta = selectorArchivo.getSelectedFile().getPath();
lblRuta.setText(ruta);
}
}
private void btnGuardarActionPerformed(ActionEvent evt)
{
JFileChooser selectorArchivo = new JFileChooser();
int resultado = selectorArchivo.showSaveDialog(null);
if (resultado == JFileChooser.APPROVE_OPTION) {
String ruta = selectorArchivo.getSelectedFile().getPath();
lblRuta.setText(ruta);
}
}
private void btnColorActionPerformed(ActionEvent evt)
{
Color color = JColorChooser.showDialog(this, "Seleccione un color", Color.GRAY);
if (color != null)
contenedor.setBackground(color);
}
public static void main(String[] args)
{
new Test().setVisible(true);
}
} |
Por último, se tiene a las cajas de diálogo:
-PERSONALIZADAS: Son hechas a medida extendiendo la clase JDialog de la JFC.
(Cuando disponga de tiempo preparo uno de este tipo...)
Un JPanel no es más que un contenedor de componentes (incluyendo otros paneles) y se utiliza generalmente para organizar la distribución de los controles en un contenedor de alto nivel (JFrame, JDialog, JApplet).
EDITO: Realizo corrección al procesar diálogo abrir y guardar.
Un saludo. |