我有一个组件,我想显示自定义jtooltip.这很简单,只需更改getTooltip方法即可.类似于位置和文字.
但是我也想改变计时器.如果鼠标位于组件的cellrenderer上,则应始终显示工具提示.如果它离开了所有这些,它应该变得不可见.我知道我可以使用TooltipManager来控制全局时间.但最好的解决方案可能只是短截线,并用鼠标滑块显示工具提示.但是,当我尝试这样做时(取消注册TooltipManager中的组件并将工具提示设置为可见,文本和位置正确,在鼠标监听器中)工具提示根本没有显示.我究竟做错了什么?
编辑:现在问题已经改变了!分为2个问题.
我的解决方案现在就是这个,但它失去了jtooltip总是有时令人沮丧地显示的阴影,并且如果鼠标退出弹出窗口本身就会隐藏它.如果弹出窗口甚至不是组件,如何通过弹出窗口过滤mouseexit事件?我可以根据lastPosition做一些黑客攻击,但这看起来很愚蠢,因为我真的不知道它的宽度.
private Popup lastPopup;
private final JToolTip tooltip = ...;
private Point lastPoint;
@Override public void mouseMoved(MouseEvent e) {
Point p = privateToolTipLocation(e);
if (p == null || p.equals(lastPoint)) {
return;
}
lastPoint = p;
tooltip.setTipText(privateToolTipText(e));
//copy
p = new Point(p);
SwingUtilities.convertPointToScreen(p, this);
Popup newPopup = PopupFactory.getSharedInstance().getPopup(this, tooltip, p.x, p.y);
if (lastPopup != null) {
lastPopup.hide();
}
lastPopup = newPopup;
newPopup.show();
}
@Override public void mouseExited(MouseEvent e) {
if (lastPopup != null && someUnknownCondiction) {
lastPopup.hide();
lastPopup = null;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在组件中添加鼠标侦听器,以便在鼠标进入和离开组件上方的区域时更改全局工具提示计时器,而不是尝试重新实现工具提示的显示.
这是一些示例代码:
instantTooltipComponent.addMouseListener(new MouseAdapter()
{
final int defaultTimeout = ToolTipManager.sharedInstance().getInitialDelay();
@Override
public void mouseEntered(MouseEvent e) {
ToolTipManager.sharedInstance().setInitialDelay(0);
}
@Override
public void mouseExited(MouseEvent e) {
ToolTipManager.sharedInstance().setInitialDelay(defaultTimeout);
}
});
Run Code Online (Sandbox Code Playgroud)
每当鼠标移动到组件上时,这应该将工具提示延迟更改为零,并在鼠标离开组件时将其更改回默认延迟.
| 归档时间: |
|
| 查看次数: |
2671 次 |
| 最近记录: |