Freitag, 14. März 2008

[Java] ToolTip-Class (Multiline, Wordwrap)

Hier finden sie eine Java-Class zum Rendern mehrzeiliger Tooltips. Die Klasse nutzt zur eigentlichen Anzeige ein JTextArea. Dadurch wird ein automatischer Zeilenumbruch innerhalb der Tooltips ermöglicht.
Wird eine maximale Breite vorgegeben ("setMaximumWidth(int width)") wird der Tooltip-Text automatisch umgebrochen. Wird als maximale Breite 0 angegeben (Standardeinstellung), so werden die Zeilen im Tooltip nur an den vorgegebenen Stellen ("\n") umgebrochen. Ist der Tooltip-Text kürzer als die angegebene Maximalbreite, wird das Tooltip-Feld natürlich nur so breit wie der Text gerendert.

Will man diese Klasse global nutzen, wird diese in der Applikation über folgenden Aufruf initialisiert:

MultiLineToolTipUI.setMaximumWidth(250); // optional!
MultiLineToolTipUI.setInsets(3); // optional!
MultiLineToolTipUI.initialize();

Steuern lässt sich das applikationsweite Verhalten der Tooltips per ToolTipManager:

javax.swing.ToolTipManager.sharedInstance().setDismissDelay(20000);
javax.swing.ToolTipManager.sharedInstance().setInitialDelay(1000);
javax.swing.ToolTipManager.sharedInstance().setReshowDelay(200);

Die "20000" bezeichnet im obigen Fall die Dauer der Anzeige der Tooltips in Millisekunden. Die Tooltips werden nach 1000ms angezeigt.

Sourcecode bei pastebin.ca
import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicToolTipUI;

/*
 *  Renders ToolTips:
 *  - with multiple lines
 *  - autowidth + max. width
 *  - linewrap
 *  - uses jTextArea
 *
 *  For ease of use insert the following lines into your Application:
 *
 *   MultiLineToolTipUI.setMaximumWidth(250);  // optional!
 *   MultiLineToolTipUI.setInsets(3);          // optional!
 *   MultiLineToolTipUI.initialize();
 *
 *  You can drive your tooltips by ToolTipManager:
 *
 *   javax.swing.ToolTipManager.sharedInstance().setDismissDelay(20000);
 *   javax.swing.ToolTipManager.sharedInstance().setInitialDelay(1000);
 *   javax.swing.ToolTipManager.sharedInstance().setReshowDelay(200);
 *
 */
public class MultiLineToolTipUI extends BasicToolTipUI {

    protected CellRendererPane rendererPane;
    private static JTextArea textArea;
    private static Border textAreaBorder = BorderFactory.createEmptyBorder(2,2,2,2);
    private static int maximumWidth = 0;

    static MultiLineToolTipUI singleton = new MultiLineToolTipUI();

    public static void initialize() {
        // don't hardcode class name
        String key = "ToolTipUI";
        Class cls = singleton.getClass();
        String name = cls.getName();
        UIManager.put(key,name);
        UIManager.put(name,cls);
    }

    private MultiLineToolTipUI() {
        super();
    }

    public static ComponentUI createUI(JComponent c) {
        return singleton;
    }

    public void installUI(JComponent c) {
        super.installUI(c);
        rendererPane = new CellRendererPane();
        c.add(rendererPane);
    }

    public void uninstallUI(JComponent c) {
        super.uninstallUI(c);
        c.remove(rendererPane);
        rendererPane = null;
    }

    /**
     *  set maximum width
     *  0 = no maximum width
     */
    public static void setMaximumWidth(int width){
        maximumWidth = width;
    }

    public static void setInsets(int width){
        textAreaBorder = BorderFactory.createEmptyBorder(width, width, width, width);
    }


    public void paint(Graphics g, JComponent c) {
        Dimension size = c.getSize();
        textArea.setBackground(c.getBackground());
        rendererPane.paintComponent(g, textArea, c, 1, 1,
                    size.width - 1, size.height - 1, true);
    }

    public Dimension getPreferredSize(JComponent c) {
        String tipText = ((JToolTip)c).getTipText();
        if (tipText == null){
            return new Dimension(0,0);
        }
        textArea = new JTextArea(tipText );
        textArea.setBorder(textAreaBorder);
        textArea.setFont(UIManager.getFont("ToolTip.font"));

        rendererPane.removeAll();
        rendererPane.add(textArea );
        textArea.setWrapStyleWord(true);

        textArea.setLineWrap(false);

        if( maximumWidth > 0 && maximumWidth < textArea.getPreferredSize().getWidth()){
            textArea.setLineWrap(true);
            Dimension d = textArea.getPreferredSize();
            d.width = maximumWidth;
            d.height++;
            textArea.setSize(d);
         }
         Dimension dim = textArea.getPreferredSize();
         dim.height += 1;
         dim.width += 1;
         return dim;
    }

    public Dimension getMinimumSize(JComponent c) {
        return getPreferredSize(c);
    }

    public Dimension getMaximumSize(JComponent c) {
        return getPreferredSize(c);
    }
}
Spackotus (Gast) - 2011-09-19 13:54

Vielen Dank!
Du hat mir beim schreiben eines .log-viewers sehr geholfen, vor allem, was die Übersichtlichkeit anbelangt ;)
Gruss Spackotus

x (Gast) - 2012-05-25 16:30

Bei mir gibt es eine Exception:

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
at sun.font.FontDesignMetrics$MetricsKey.init(FontDesignMetrics.java:217)
at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:286)
at sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1012)
at javax.swing.JComponent.getFontMetrics(JComponent.java:1624)
at javax.swing.text.WrappedPlainView.updateMetrics(WrappedPlainView.java:318)
at javax.swing.text.WrappedPlainView.setSize(WrappedPlainView.java:381)
at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1714)
at javax.swing.plaf.basic.BasicTextUI.modelToView(BasicTextUI.java:1046)
at javax.swing.text.DefaultCaret.repaintNewCaret(DefaultCaret.java:1307)
at javax.swing.text.DefaultCaret$1.run(DefaultCaret.java:1286)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
at java.awt.EventQueue.access$000(EventQueue.java:102)
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

Zur Lösung muß die Zeile

textArea.setFont(UIManager.getFont("ToolTip"));

durch

textArea.setFont(UIManager.getFont("ToolTip.font"));

ersetzt werden.

techomatic - 2012-07-11 00:12

Danke für den Hinweis. Ist korrigiert.

Suche

 

Aktuelle Beiträge

Anleitung Dieselheizung...
Den beliebten Dieselheizungen aus chinesischer Produktion...
techomatic - 2022-11-13 00:35
Reifendruckkontrolle...
Wenn die Reifendruckkontrollleuchte (Toyota Yaris III)...
techomatic - 2022-10-23 13:58
openSSH-Keys mit Putty(gen)...
Ziel: openSSH-Keypaare unter Windows erzeugen Problem: Putty.. .
techomatic - 2021-02-20 13:59
mp4-Videos mit Virtualdub...
Für Virtualdub gibt es einen sehr guten Entwackler...
techomatic - 2018-11-03 21:26
[SMB] XP WIN7 WIN10 Login...
Wer beim Versuch auf Windows-Freigaben eines XP-Rechners...
techomatic - 2018-05-04 22:04

Credits

powered by Antville powered by Helma


xml version of this page

twoday.net AGB

click tracking

Status

Online seit 5924 Tagen
Zuletzt aktualisiert: 2022-11-17 19:10

System