如何在“Java Swing”中获取鼠标悬停事件

时间:2014-08-19 21:17:49

标签: java swing mouseevent mouselistener

我有一个JPanel,其中包含多个组件 - 例如一些JLabelsJTextBoxesJComboBoxesJCheckBoxes等。

如果用户将鼠标悬停在这些组件上3秒钟,我想显示一个弹出式帮助窗口。

到目前为止,我在其中一个组件中添加了MouseListener,它确实显示了所需的弹出窗口和帮助。但是在3秒延迟后我无法实现它。一旦用户将鼠标移动到组件的该区域,弹出窗口就会显示。这非常令人讨厌,因为组件几乎无法使用。我尝试使用MouseMotionListener并在mouseMoved(MouseEvent e)方法中使用以下代码。产生同样的效果。

有关如何实现鼠标悬停效果的任何建议 - 仅在延迟3秒后显示弹出窗口?

示例代码:(鼠标输入方法)

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");
        }
    }

}

1 个答案:

答案 0 :(得分:5)

mouseEntered()中使用Timer。这是一个有效的例子:

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);
    }
}