Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>As pajton noted in a previous comment, Popup is not a JComponent to which listeners can be readily bound. But, as its documentation states, "implementations of Popup are responsible for creating and maintaining their own Components to render [its subject] to the user."</p> <p>So in using it as your presentation mechanism, your Popup is going to have to present itself as an actual Swing component <em>anyway</em>. Have it register <em>itself</em> to that component. Have it hide itself when the component loses focus.</p> <pre><code>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); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload