3

タスクの現在の進行状況を表示するツールチップを取得しようとしています。そのため、ツールチップが表示されている間にツールチップのテキストを変更したいと考えています。しかし、私が呼び出すとsetToolTipText()、表示されたテキストは、ツールチップコンポーネントからマウスを終了して再度入力するまで同じままです。そして、前に呼び出しsetToolTipText(null)ても何も変わりません。

4

2 に答える 2

6

実際、呼び出し間でツールチップを 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();
            }
        });
    }
}
于 2012-10-10T15:37:32.323 に答える
-1

これは、単一の方法で自己完結型の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);
}
于 2016-03-05T00:26:47.473 に答える