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

par*_*a25 3 java swing dynamic tooltip

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

Gui*_*let 5

事实上,它不会自我更新,即使在调用之间将工具提示重置为 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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)