Tengo un JDialog
comme une fenêtre pop-up qui s'affiche pendant 3 secondes et est supprimée.
Il apparaît à la position du curseur et ne doit être éliminé que si le curseur quitte le popup.
Si le curseur est entré dans la fenêtre pop-up, le minuteur s'arrête et redémarre à la sortie.
Mais ma première idée avec un dispose- Timer
qui démarre et s'arrête via MouseListener
ne fonctionne pas avec certains JComponent
ce qui provoque un mouseExited()
.
Ma deuxième idée ne démarrera jamais la minuterie
public void mouseExited( MouseEvent e ) {
if(!Popup.this.getBounds().contains( e.getLocationOnScreen() )){
timer.start();
}
}
Je ne veux pas ajouter le Listener à chaque composant de la popup.
Y a-t-il un moyen facile de le faire ?
Exemple :
public class Popup extends JDialog {
private static final long serialVersionUID = 1337L;
private final Timer timer = new Timer( 3000, new ActionListener() {
@Override
public void actionPerformed( ActionEvent e ) {
Popup.this.dispose();
System.exit( 0 );
}
});
public Popup() {
setBounds( 100, 100, 300, 300 );
addMouseListener( new PopupBehavior() );
getContentPane().setLayout( new BorderLayout() );
getContentPane().add( new JTextArea(), BorderLayout.NORTH );
getContentPane().add( new JSplitPane(0,new JPanel(), new JLabel("2")), BorderLayout.CENTER );
getContentPane().add( new JProgressBar(), BorderLayout.SOUTH );
getContentPane().add( new JLabel("west"), BorderLayout.WEST );
getContentPane().add( new JSpinner(), BorderLayout.EAST );
}
public static void main( String[] args ) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
new Popup().setVisible( true );
}
});
}
private class PopupBehavior extends MouseAdapter {
@Override
public void mouseEntered( MouseEvent e ) {
System.out.println("mouseEntered");
timer.stop();
}
@Override
public void mouseExited( MouseEvent e ) {
System.out.println("mouseExited");
timer.start();
}
}
}