entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

¿JFrame activo?

Buenas tardes compañeros, después del otro problema que conseguisteis ayudarme a solucionarlo, tengo otro un tanto mas visual.

//Añado botones de interacción con el usuario
        AddConexion = new JButton(new ImageIcon(MenuGUI.class.getResource("/com/sun/java/swing/plaf/windows/icons/agrega.png")));
        AddConexion.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                //Llamo a la clase "Añadir Conexión"
                try{
                    AñadirConexion.main(null);
                    //Compruebo que la ventana "Añadir Conexión" esta abierta y la cierro
                    /*if (EC.isEnabled()){
                        EC.dispose();
                    }*/
                }catch (Exception e1){
                    JOptionPane.showMessageDialog(null, e1);
                }
            }
        });
        AddConexion.setBounds(10, 40, 24, 24);
        getContentPane().add(AddConexion);

        btnEliminarConexion = new JButton("");
        btnEliminarConexion.setIcon(new ImageIcon(MenuGUI.class.getResource("/com/sun/java/swing/plaf/windows/icons/Cruz-roja.png")));
        btnEliminarConexion.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //Llamo a la clase "Eliminar conexión"
                try{
                    EliminarConexion.main(null);
                    //Compruebo que la ventana "Añadir Conexión" esta abierta y la cierro
                    /*if (AC.isEnabled()){
                        AC.dispose();
                    }*/
                }catch (Exception e1){
                    JOptionPane.showMessageDialog(null, e1);
                }
            }
        });
        btnEliminarConexion.setBounds(38, 40, 24, 24);
        getContentPane().add(btnEliminarConexion);

Como pueden ver por el código, lo que trato de conseguir es que, cuando una ventana esté activa, si le doy a otra, automáticamente se cierre esta anterior (solo tengo 2 botones con ventanas).

No se como hacer el resto, ya que me da un error Null al proceder a su cierre y, me gustaría saber de que forma puedo lograr este resultado. He estado investigando y viendo por Google que hay que hacer esto.

public void windowActivated(WindowEvent e){
    setEnabled(true);
}

Esto lo tengo en las clases JFrame para enviar una señal a JAVA diciéndole "Ventana Activa" para intentar ese efecto, pero sé que esta mal porque no funciona xDDD

El código de esa clase es este:

import java.awt.Color;

@SuppressWarnings("serial")
public class AñadirConexion extends JFrame {
    ConexionDB objConex;

    private JLabel lblUsuario, lblContraseña, lblHost, lblPuerto, lblBD, lblAlias;
    static public JTextField UsuarioField, HostField, PuertoField, BDField, AliasField;
    static public JPasswordField passwordField;
    private JButton btnGuardar, btnConectar, btnReset, btnSalir;

    public AñadirConexion() {
        initcomponents();
        objConex = new ConexionDB();
    }

    private void initcomponents() {
        //Propiedades del JFrame o Ventana
        setSize(new Dimension(400, 200));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setResizable(false);
        setLocation(new Point(400, 250));
        getContentPane().setLayout(null);
        setTitle("Añadir Cliente");

        //Etiquetas para los cuadros de texto
        lblUsuario = new JLabel("Usuario");
        lblUsuario.setBounds(10, 11, 46, 14);
        getContentPane().add(lblUsuario);

        lblContraseña = new JLabel("Contraseña");
        lblContraseña.setBounds(206, 11, 77, 14);
        getContentPane().add(lblContraseña);

        lblHost = new JLabel("Host");
        lblHost.setBounds(10, 36, 46, 14);
        getContentPane().add(lblHost);

        lblPuerto = new JLabel("Puerto");
        lblPuerto.setBounds(206, 36, 46, 14);
        getContentPane().add(lblPuerto);

        lblBD = new JLabel("Nombre BD");
        lblBD.setBounds(10, 59, 77, 14);
        getContentPane().add(lblBD);

        lblAlias = new JLabel("Alias");
        lblAlias.setBounds(206, 59, 46, 14);
        getContentPane().add(lblAlias);

        //Cuadros de texto donde introducir datos
        UsuarioField = new JTextField();
        UsuarioField.setBounds(97, 8, 86, 20);
        getContentPane().add(UsuarioField);
        UsuarioField.setColumns(10);

        passwordField = new JPasswordField();
        passwordField.setBounds(292, 8, 86, 20);
        getContentPane().add(passwordField);

        HostField = new JTextField();
        HostField.setBounds(97, 33, 86, 20);
        getContentPane().add(HostField);
        HostField.setColumns(10);

        PuertoField = new JTextField();
        PuertoField.setBounds(292, 33, 86, 20);
        getContentPane().add(PuertoField);
        PuertoField.setColumns(10);

        BDField = new JTextField();
        BDField.setBounds(97, 56, 86, 20);
        getContentPane().add(BDField);
        BDField.setColumns(10);

        AliasField = new JTextField();
        AliasField.setBounds(292, 56, 86, 20);
        getContentPane().add(AliasField);
        AliasField.setColumns(10);

        //Botones de iteracción con el usuario      
        btnGuardar = new JButton("Guardar");
        btnGuardar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    EscribeFichero.main(null);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
        btnGuardar.setBounds(10, 87, 91, 23);
        getContentPane().add(btnGuardar);

        btnConectar = new JButton("Conectar");
        btnConectar.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    try {
                        objConex.conectar();
                        //Compruebo si la conexión esta activa
                        if (!ConexionDB.getConex().isClosed()){
                            MenuGUI.EstadoConx.setText("¡Conectado!");
                            MenuGUI.EstadoConx.setForeground(Color.GREEN);
                        }else{
                            MenuGUI.EstadoConx.setText("Error al conectar");
                        }
                    } catch (SQLException e1) {
                        JOptionPane.showInputDialog(e1, "No se pudo  establecer conexión");
                    }
                }
        });
        btnConectar.setBounds(10, 137, 91, 23);
        getContentPane().add(btnConectar);

        btnReset = new JButton("Resetear Datos");
        btnReset.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

            }
        });
        btnReset.setBounds(111, 137, 128, 23);
        getContentPane().add(btnReset);

        btnSalir = new JButton("Salir");
        btnSalir.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //Cierro la ventana limpiando el objeto en la memoria
                dispose();
            }
        });
        btnSalir.setBounds(287, 137, 91, 23);
        getContentPane().add(btnSalir);
    }

    public void windowActivated(WindowEvent e){
        setEnabled(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    AñadirConexion frame = new AñadirConexion();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

¿Algún consejo?

1 Respuesta

2votos

xabe Puntos2180

Hola

A ver si este código te sirve para solucionar el problema

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;

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

public class Modal extends JFrame {

    private JLabel lblUsuario;

    private JPanel jPanel;
    private JButton btnModal;
    private JButton btnSalir;
    private ModalAutoCierre autoCierre;

    public Modal() {
        initcomponents();     
    }

    private void initcomponents() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setResizable(false); 
        setSize(500, 500);
        setLocationRelativeTo(null);
        setLayout(new BorderLayout());
        setTitle("Ejemplo de Modal");
        autoCierre = new ModalAutoCierre(this);

        //Etiquetas para los cuadros de texto
        lblUsuario = new JLabel("Modal auto cierre cuando se pulsa en frame padre");

        jPanel = new JPanel();

        btnModal = new JButton("Modal Auto Cierre");
        btnModal.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                autoCierre.setVisible(true);
            }
        });
        jPanel.add(btnModal);

        btnSalir = new JButton("Salir");
        btnSalir.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });

        jPanel.add(btnSalir);

        add(lblUsuario, BorderLayout.CENTER);
        add(jPanel, BorderLayout.SOUTH);

    }

    public void windowActivated(WindowEvent e){
        setEnabled(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Modal frame = new Modal();
                    frame.setVisible(true);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    class ModalAutoCierre extends JDialog {

        private ModalAutoCierre current;

        public ModalAutoCierre(final Frame owner) {
            super(owner);
            current = this;
            JPanel pnl = new JPanel(new BorderLayout());
            pnl.add(new JLabel("Pulsa fuera del dialogo para cerrar la ventana o el boton"), BorderLayout.NORTH);
            JButton btn = new JButton("Cierra dialogo");
            btn.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    current.setVisible(false);
                }
            });
            pnl.add(btn, BorderLayout.CENTER);
            this.setContentPane(pnl);
            this.pack();
            this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            this.setLocationRelativeTo(owner);
            this.setAlwaysOnTop(true);
            this.addWindowFocusListener(new WindowFocusListener() {

                public void windowGainedFocus(WindowEvent e) {
                    //do nothing
                }

                public void windowLostFocus(WindowEvent e) {
                    if(e.getOppositeWindow() != null)
                    {
                        //si no pincho en la ventana padre no hago nada y si pincho ne la ventana padre cierro la modal
                        if (SwingUtilities.isDescendingFrom(e.getOppositeWindow(), current)) {
                            return;
                        }
                        current.setVisible(false);
                    }

                }

            });
        }
    }
}

Saludos

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta