我有一个JPanel
,其中包含多个组件 - 例如一些JLabels
,JTextBoxes
,JComboBoxes
,JCheckBoxes
等。
如果用户将鼠标悬停在这些组件上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");
}
}
}
答案 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);
}
}