How to get Mouse hover event in `Java Swing`
Asked Answered
P

1

9

I have a JPanel with multiple components in it - like a few JLabels, JTextBoxes, JComboBoxes, JCheckBoxes etc.

I want to display a pop up help window if the user hovers over these components for say 3 secs.

So far I added a MouseListener to one of my Components and it does display the required pop up and help. However I can't achieve it after 3 sec delay. As soon as the user moves the mouse to through that area of the component the pop up displays. This is very annoying as the components are almost unusable. I have tried using MouseMotionListener and having the below code in mouseMoved(MouseEvent e) method. Gives the same effect.

Any suggestion on how can I achieve the mouse hover effect - to display the pop up only after 3 sec delay?

Sample Code:(Mouse Entered method)

private JTextField _textHost = new JTextField();

this._textHost().addMouseListener(this);

@Override
public void mouseEntered(MouseEvent e) {

    if(e.getSource() == this._textHost())
    {
        int reply = JOptionPane.showConfirmDialog(this, "Do you want to see the related help document?", "Show Help?", JOptionPane.YES_NO_OPTION);
        if(reply == JOptionPane.YES_OPTION)
        {
            //Opens a browser with appropriate link. 
            this.get_configPanel().get_GUIApp().openBrowser("http://google.com");
        }
    }

}
Perzan answered 19/8, 2014 at 21:17 Comment(2)
Have you looked at tool tips?Ardor
@Ardor with ToolTips, I can only set the string. However I want to display the confirmation dialogue and depending on response open the browser for help (same code as I show in the mouseEntered method above). Is there any way that I can have confirmation dialogue implemented through ToolTip?Perzan
H
8

Use a Timer in mouseEntered(). Here's a working example:

public class Test {

    private JFrame frame;


    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                Test test = new Test();
                test.createUI();
            }
        });
    }

    private void createUI() {
        frame = new JFrame();
        JLabel label = new JLabel("Test");
        label.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseEntered(MouseEvent me) {
                startTimer();
            }
        });

        frame.getContentPane().add(label);
        frame.pack();
        frame.setVisible(true);
    }

    private void startTimer() {
        TimerTask task = new TimerTask() {

            @Override
            public void run() {
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        JOptionPane.showMessageDialog(frame, "Test");
                    }
                });
            }
        };

        Timer timer = new Timer(true);
        timer.schedule(task, 3000);
    }
}
Heeley answered 19/8, 2014 at 21:25 Comment(1)
Guess the timer should be stop after leaving mouse.Heins

© 2022 - 2024 — McMap. All rights reserved.