2012-06-21 61 views
4

我正在實施MVC,我想在我看來,JLabel上有JToolTip。我成功了,但現在我想設置解僱和初始計時器。Java中的ToolTipManager

我讀了Javadoc的JToolTipTollTipManager。我在ToolTipManager中找到了我想要的,但現在我無法理解如何使用它。

JToolTip沒有制定者ToolTipManager並在doc他們說:

管理系統中的所有工具提示。

我真的不明白,應該怎樣使用ToolTipManager。我的視圖應該延伸ToolTipManager還是我完全誤導了?

回答

10

ToolTipManager是一個單身人士。要使用它,你需要調用返回這個類的實例的靜態方法sharedInstance

ToolTipManager管理所有工具提示 - 它是一個全局配置類,對sharedInstance所做的更改將應用​​於應用程序中的每個工具提示。

+0

那麼我沒有意識到^^。它完美的工作! –

+0

嗯它也適用於我。但是有沒有其他方法可以做到這一點?在我的應用程序中,我想要有2種不同的工具提示行爲。在我的JList中,它們應該很快消失。但在按鈕上應該會持續更長的時間。我必須使用一個(怪異的)鼠標監聽器嗎? – Sauer

6

這裏是展示瞭如何使用時,ToolTipManager一個例子:

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 
import javax.swing.ToolTipManager; 

public class TestTooltips { 

    protected static void initUI() { 
     ToolTipManager.sharedInstance().setInitialDelay(0); 
     ToolTipManager.sharedInstance().setDismissDelay(500); 
     JFrame frame = new JFrame("test"); 
     JLabel label = new JLabel("Label text"); 
     label.setToolTipText("My cool nice and fun tooltip"); 
     frame.add(label); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 
4

不知道你是怎麼試過,真的,你想什麼...,你的成功有如下代碼

import java.awt.*; 
import java.awt.event.MouseWheelEvent; 
import java.awt.event.MouseWheelListener; 
import javax.swing.*; 
import javax.swing.table.DefaultTableCellRenderer; 

public class JScrollableToolTip extends JToolTip { 

    private static final long serialVersionUID = 1L; 
    private final MouseWheelListener mouseWheelListener; 
    private final JTextArea tipArea; 

    public JScrollableToolTip(final int rows, final int columns) { 
     setLayout(new BorderLayout()); 
     mouseWheelListener = createMouseWheelListener(); 
     tipArea = new JTextArea(rows, columns); 
     tipArea.setLineWrap(true); 
     tipArea.setWrapStyleWord(true); 
     tipArea.setEditable(false); 
     LookAndFeel.installColorsAndFont(tipArea, "ToolTip.background", 
       "ToolTip.foreground", "ToolTip.font"); 
     JScrollPane scrollpane = new JScrollPane(tipArea); 
     scrollpane.setBorder(null); 
     scrollpane.getViewport().setOpaque(false); 
     add(scrollpane); 
    } 

    private MouseWheelListener createMouseWheelListener() { 
     return new MouseWheelListener() { 

      @Override 
      public void mouseWheelMoved(final MouseWheelEvent e) { 
       JComponent component = getComponent(); 
       if (component != null) { 
        tipArea.dispatchEvent(new MouseWheelEvent(tipArea, e.getID(), 
          e.getWhen(), e.getModifiers(), 0, 0, e.getClickCount(), 
          e.isPopupTrigger(), e.getScrollType(), e.getScrollAmount(), 
          e.getWheelRotation())); 
       } 
      } 
     }; 
    } 

    @Override 
    public void addNotify() { 
     super.addNotify(); 
     JComponent component = getComponent(); 
     if (component != null) { 
      component.addMouseWheelListener(mouseWheelListener); 
     } 
    } 

    @Override 
    public void removeNotify() { 
     JComponent component = getComponent(); 
     if (component != null) { 
      component.removeMouseWheelListener(mouseWheelListener); 
     } 
     super.removeNotify(); 
    } 

    @Override 
    public void setComponent(JComponent c) { 
     JComponent component = getComponent(); 
     if (component != null) { 
      component.removeMouseWheelListener(mouseWheelListener); 
     } 
     super.setComponent(c); 
    } 

    @Override 
    public void setTipText(final String tipText) { 
     String oldValue = this.tipArea.getText(); 
     tipArea.setText(tipText); 
     tipArea.setCaretPosition(0); 
     firePropertyChange("tiptext", oldValue, tipText); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return getComponent(0).getPreferredSize(); 
    } 

    @Override 
    public String getTipText() { 
     return tipArea == null ? "" : tipArea.getText(); 
    } 

    @Override 
    protected String paramString() { 
     String tipTextString = (tipArea.getText() != null ? tipArea.getText() : ""); 
     return super.paramString() + ",tipText=" + tipTextString; 
    } 

    //for testing only: 
    public static void main(final String args[]) { 
     EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       JFrame f = new JFrame("JScrollableToolTip"); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setSize(300, 200); 
       f.setLocationRelativeTo(null); 
       ToolTipManager.sharedInstance().setInitialDelay(500); 
       ToolTipManager.sharedInstance().setDismissDelay(10000); 
       ToolTipManager.sharedInstance().mousePressed(null); 
       JTable table = new JTable(50, 4) { 

        private static final long serialVersionUID = 1L; 

        @Override 
        public JToolTip createToolTip() { 
         JScrollableToolTip tip = new JScrollableToolTip(3, 20); 
         tip.setComponent(this); 
         return tip; 
        } 
       }; 
       table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { 

        private static final long serialVersionUID = 1L; 

        @Override 
        public Component getTableCellRendererComponent(JTable table, Object value, 
          boolean isSelected, boolean hasFocus, int row, int column) { 
         super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
         setToolTipText("Row " + row + " Column " + column 
           + "\nUsed to display a 'Tip' for a Component. " 
           + "Typically components provide api to automate the process of " 
           + "using ToolTips. For example, any Swing component can use the " 
           + "JComponent setToolTipText method to specify the text for a standard tooltip."); 

         return this; 
        } 
       }); 
       f.add(new JScrollPane(table)); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+0

+1例如,但我只是在尋找使用'ToolTipManager'作爲它的方法'setDismissDelay'和'setInitialDelay'。我的觀點已經奏效。 –

+1

只是注意,也許在你的情況下不相關,不要使用JToolTip生產代碼,有基於JWindow的自定義工具提示+1對於奇怪的問題 – mKorbel