Set the Tooltip Delay Time for a Particular Component in Java Swing

前端 未结 4 1173
不思量自难忘°
不思量自难忘° 2020-12-29 21:39

I\'m trying to set tooltips on a JEditorPane. The method which I use to determine what tooltip text to show is fairly CPU intensive - and so I would like to onl

相关标签:
4条回答
  • 2020-12-29 21:53

    Well, I would recommend doing the CPU intensive task on another thread so it doesn't interrupt normal GUI tasks.

    That would be a better solution. (instead of trying to circumvent the problem)

    *Edit* You could possibly calculate the tootips for every word in the JEditorPane and store them in a Map. Then all you would have to do is access the tootip out of the Map if it changes.

    Ideally people won't be moving the mouse and typing at the same time. So, you can calculate the tootlips when the text changes, and just pull them from the Map on mouseMoved().

    0 讨论(0)
  • 2020-12-29 21:56

    If what you want is to make the tooltip dismiss delay much longer for a specific component, then this is a nice hack:

    (kudos to tech at http://tech.chitgoks.com/2010/05/31/disable-tooltip-delay-in-java-swing/)

    private final int defaultDismissTimeout = ToolTipManager.sharedInstance().getDismissDelay();
    
    addMouseListener(new MouseAdapter() {
    
      public void mouseEntered(MouseEvent me) {
        ToolTipManager.sharedInstance().setDismissDelay(60000);
      }
    
      public void mouseExited(MouseEvent me) {
        ToolTipManager.sharedInstance().setDismissDelay(defaultDismissTimeout);
      }
    });
    
    0 讨论(0)
  • 2020-12-29 22:04

    You can show the popup yourself. Listen for mouseMoved() events, start/stop the timer and then show popup with the following code:

    First you need PopupFactory, Popup, and ToolTip:

    private PopupFactory popupFactory = PopupFactory.getSharedInstance();
    private Popup popup;
    private JToolTip toolTip = jEditorPane.createToolTip();
    

    then, to show or hide the toolTip:

    private void showToolTip(MouseEvent e) {
        toolTip.setTipText(...);
        int x = e.getXOnScreen();
        int y = e.getYOnScreen();
        popup = popupFactory.getPopup(jEditorPane, toolTip, x, y);
        popup.show();
    }
    
    private void hideToolTip() {
        if (popup != null)
            popup.hide();
    }
    

    This will give you adjustable delay and a lot of troubles :)

    0 讨论(0)
  • 2020-12-29 22:12

    FWIW, here is code that is based on the post by Noel. It takes that prior art and wraps it in a new class where the default is stored statically. Just in case anyone may benefit:

    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    import javax.swing.*;
    
    /**
     * Provides customizable tooltip timeouts for a {@link javax.swing.JComponent}.
     *
     * @see ToolTipManager#setDismissDelay(int).
     */
    public final class CustomTooltipDelayer extends MouseAdapter
    {
      private static final int defaultDismissTimeout = ToolTipManager.sharedInstance().getDismissDelay();
    
      private final int _delay;
    
      /**
       * Override the tooltip timeout for the given component in raw millis.
       *
       * @param component target
       * @param delay the timeout duration in milliseconds
       */
      public static CustomTooltipDelayer attach(JComponent component, int delay)
      {
        CustomTooltipDelayer delayer = new CustomTooltipDelayer(delay);
        component.addMouseListener( delayer );
        return delayer;
      }
    
      /**
       * Override the tooltip timeout for the given component as a ratio of the JVM-wide default.
       *
       * @param component target
       * @param ratio the timeout duration as a ratio of the default
       */
      public static CustomTooltipDelayer attach(JComponent component, float ratio)
      {
        return attach( component, (int)(defaultDismissTimeout * ratio) );
      }
    
      /** Use factory method {@link #attach(JComponent, int)} */
      private CustomTooltipDelayer(int delay)
      {
        _delay = delay;
      }
    
      @Override
      public void mouseEntered( MouseEvent e )
      {
        ToolTipManager.sharedInstance().setDismissDelay(_delay);
      }
    
      @Override
      public void mouseExited( MouseEvent e )
      {
        ToolTipManager.sharedInstance().setDismissDelay(defaultDismissTimeout);
      }
    }
    
    0 讨论(0)
提交回复
热议问题