动态更新当前显示的工具提示

我正在尝试获得一个显示任务当前进度的工具提示。 所以我想在工具提示显示时更改工具提示文本。 但是,当我调用setToolTipText() ,显示的文本保持不变,直到我从工具提示组件退出鼠标并再次输入。 并且之前调用setToolTipText(null)不会改变任何东西。

实际上,即使在调用之间将工具提示重置为null,它也不会自行更新。

到目前为止,我发现的唯一技巧是模拟鼠标移动事件并在TooltipManager上转发它。 这让他觉得鼠标移动了,工具提示必须重新定位。 不漂亮,但效率很高。

看看这个演示代码,它显示从0到100的%进度:

 import java.awt.MouseInfo; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.ToolTipManager; public class TestTooltips { protected static void initUI() { JFrame frame = new JFrame("test"); final JLabel label = new JLabel("Label text"); frame.add(label); frame.pack(); frame.setVisible(true); Timer t = new Timer(1000, new ActionListener() { int progress = 0; @Override public void actionPerformed(ActionEvent e) { if (progress > 100) { progress = 0; } label.setToolTipText("Progress: " + progress + " %"); Point locationOnScreen = MouseInfo.getPointerInfo().getLocation(); Point locationOnComponent = new Point(locationOnScreen); SwingUtilities.convertPointFromScreen(locationOnComponent, label); if (label.contains(locationOnComponent)) { ToolTipManager.sharedInstance().mouseMoved( new MouseEvent(label, -1, System.currentTimeMillis(), 0, locationOnComponent.x, locationOnComponent.y, locationOnScreen.x, locationOnScreen.y, 0, false, 0)); } progress++; } }); t.start(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { initUI(); } }); } } 

这是Guillaume Polet答案的简化版本,该答案在单一方法中是独立的。 这段代码假定有人调用了component.setToolTip("..."); 先前。 此代码显示如何定期更新工具提示以显示进度。

 public static void showToolTip(JComponent component) { ToolTipManager manager; MouseEvent event; Point point; String message; JComponent component; long time; manager = ToolTipManager.sharedInstance(); time = System.currentTimeMillis() - manager.getInitialDelay() + 1; // So that the tooltip will trigger immediately point = component.getLocationOnScreen(); event = new MouseEvent(component, -1, time, 0, 0, 0, point.x, point.y, 1, false, 0); ToolTipManager. sharedInstance(). mouseMoved(event); }