如何更改1个组件的jtooltip计时器

i30*_*817 4 java swing

我有一个组件,我想显示自定义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)

Joe*_*han 7

您可以在组件中添加鼠标侦听器,以便在鼠标进入和离开组件上方的区域时更改全局工具提示计时器,而不是尝试重新实现工具提示的显示.

这是一些示例代码:

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)

每当鼠标移动到组件上时,这应该将工具提示延迟更改为零,并在鼠标离开组件时将其更改回默认延迟.