Swing Tooltips als Hilfefunktion ?

Status
Nicht offen für weitere Antworten.

Souljumper

Aktives Mitglied
Hi,

ich würde gerne eine "Hilfefunktion" anhand von Tooltips implementieren. Das ganze soll so aussehen, dass wenn ich auf einen Hilfe-Button klicke an den einzelnen Feldern/Elementen Tooltips aufpoppen und etwas dazu sagen wie z.b. welche Information da rein gehört.

Nun hab ich da derzeit mehrere Probleme:

* ToolTip dauer ist zu kurz für die längeren Texte die ich da rein setzen will
* Wie erzwinge ich für alle Elemente das sie ihren Tooltip zeigen ".showToolTip()" gibts leider nicht
* Zeilenumbrüche kann der normale Tooltip wohl nicht ("\n" ist wirkungslos)

Hab dazu schon das Java Tutorial zu Tooltips gefunden und auch die ToolTipManager Klasse. Mit letzterer kann ich zwar die Dauer der Tooltips ändern. Aber der rest geht damit auch nicht.

Kann mir wer helfen oder hat ideen?
 

Wolfgang Lenhard

Bekanntes Mitglied
Man kann mit der folgenden Klasse die Größe der Tooltips einstellen:

Code:
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.CellRendererPane;
import javax.swing.JComponent;
import javax.swing.JTextArea;
import javax.swing.JToolTip;
import javax.swing.UIManager;
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 you Application:
 *  
 *      MultiLineToolTipUI.setMaximumWidth(250);
 *      MultiLineToolTipUI.initialize();
 *      javax.swing.ToolTipManager.sharedInstance().setDismissDelay(20000);
 *
 *  © Dexter 2008
 */
public class MultiLineToolTipUI extends BasicToolTipUI {

    protected CellRendererPane rendererPane;
    private static JTextArea textArea;
    private static int maximumWidth = 0;
    
    static MultiLineToolTipUI singleton = new MultiLineToolTipUI();

    @SuppressWarnings("unchecked")
	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 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 );
        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);
    }
}

Um den Standard-Tooltip zu ersetzen, musst Du möglichst irgendwo ganz am Anfang des Programms einmal die Folgenden Zeilen einfügen:

Code:
MultiLineToolTipUI.setMaximumWidth(350);
MultiLineToolTipUI.initialize();
ToolTipManager.sharedInstance().setDismissDelay(20000);

Wenn Du das DismissDelay auf 0 setzt, dann erscheinen die Tooltips, sobald die Maus darüber fährt. Oder meinst Du, dass diese immer aufgeklappt angezeigt werden?
 

jared

Aktives Mitglied
Kann man dies 1. für alle Swing Komponenten verwenden?? und 2. brauche ich hierfür keinen MouseListener oder sowat??
 

Schandro

Top Contributor
Kann man dies 1. für alle Swing Komponenten verwenden?? und 2. brauche ich hierfür keinen MouseListener oder sowat??
Die Methode setToolTipText wird in JComponent deklariert, von daher wird sie wahrscheinlich von allen Swing-Components ünterstützt.
Du brauchst keinen MouseListener, du rufst einfach nur setToolTipText auf, mehr nicht!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben