Saltar al contenido

¿Cómo ocultas una ventana emergente de Swing cuando haces clic en otro lugar?

Intenta entender el código bien previamente a aplicarlo a tu proyecto y si ttienes algo que aportar puedes dejarlo en los comentarios.

Solución:

Utilice un JPopupMenu. Puede agregarle cualquier componente, no solo elementos de menú.

Como señaló pajton en un comentario anterior, Popup no es un JComponent al que los oyentes puedan vincularse fácilmente. Pero, como dice su documentación, “las implementaciones de Popup son responsables de crear y mantener sus propios Componentes para renderizar [its subject] al usuario”.

Entonces, al usarlo como su mecanismo de presentación, su ventana emergente tendrá que presentarse como un componente Swing real de todas formas. Haz que se registre sí mismo a ese componente. Haga que se oculte cuando el componente pierda el foco.

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Point;
import java.awt.event.ActionEvent;
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.JOptionPane;
import javax.swing.Popup;

public class PopupTester extends JFrame 
    private static class MessagePopup extends Popup
        implements WindowFocusListener
    
        private final JDialog dialog;

        public MessagePopup(Frame base, String message) 
            super();
            dialog = new JOptionPane().createDialog( base, "Message" );
            dialog.setModal( false );
            dialog.setContentPane( new JLabel( message ) );
        
        @Override public void show() 
            dialog.addWindowFocusListener( this );
            dialog.setVisible( true );
        
        @Override public void hide() 
            dialog.setVisible( false );
            dialog.removeWindowFocusListener( this );
        
        public void windowGainedFocus( WindowEvent e ) 
            // NO-OP
        

        public void windowLostFocus( WindowEvent e ) 
            hide();
        
    

    public static void main(String[] args) 
    final PopupTester popupTester = new PopupTester();
    popupTester.setLayout(new FlowLayout());
    popupTester.setSize(300, 100);
    popupTester.add(new JButton("Click Me") 
      @Override
      protected void fireActionPerformed(ActionEvent event) 
        Point location = getLocationOnScreen();
          MessagePopup popup = new MessagePopup( popupTester, "Howdy" );
          popup.show();
        
      );
      popupTester.add(new JButton("No Click Me"));
      popupTester.setVisible(true);
      popupTester.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    

Puede agregar MouseListener a su panel de fondo y ocultar la ventana emergente cuando alguien hace clic en el panel.

Para reaccionar ante la minimización de la aplicación, use WindowListener adjunto a un JFrame.

Etc, etc. Puede parecer tedioso, pero seguro que funcionará.

Comentarios y puntuaciones del artículo

Recuerda que tienes permiso de valorar este ensayo .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *