2009-05-15 13 views
95

Sto tentando di visualizzare descrizioni comandi in Java che potrebbero essere o meno lunghezze di paragrafo. In che modo è possibile racchiudere lunghi suggerimenti?Tooltip multilinea in Java?

+0

Fornire un esempio di codice. –

+1

I suggerimenti per gli strumenti non avvengono automaticamente a capo automatico se sono racchiusi tra tag HTML? Non ne sono sicuro, quindi non sto inserendo questo come risposta. –

+0

Paul: solo se si dispone di interruzioni di riga esplicite. –

risposta

135

Se si configura il suggerimento nei tag <html> e </html>, è possibile interrompere le linee con i tag <br>. Vedi http://www.jguru.com/faq/view.jsp?EID=10653 per esempi e discussioni.

Oppure è possibile utilizzare la classe JMultiLineToolTip che si possono trovare molti luoghi sulla rete, tra cui tooltip http://code.ohloh.net/search?s=jmultilinetooltip

+1

Ho usato la classe JMultiLineToolTip che hai suggerito. Una volta che ho usato setFixedWidth() per limitare il tooltip a una dimensione ragionevole, ha funzionato alla grande. Grazie! –

4

usare l'HTML e manualmente rompere le linee (una semplice parola tokenizer con una lunghezza di linea fissa dovrebbe farlo) . Assicurati solo che il testo del tuo strumento inizia con "<HTML>". Interrompere le linee con "< BR/>" o "<P>". Mi rendo conto che non è la soluzione più pulita e il supporto HTML di Java è orribile, ma dovrebbe fare le cose.

23

Il testo del suggerimento che inizia con "<html>" verrà trattato come HTML. Ovviamente questo potrebbe essere un HTML molto ampio.

È possibile ignorare lo JComponent.createTooltip per sostituire il suggerimento con il proprio componente che può visualizzare ciò che si desidera.

+2

+1 per spiegare come sostituire il suggerimento predefinito –

2

È possibile creare sottoclasse JToolTip, che è un componente, e sovrascrivere createToolTip() sul componente.

4

Esempio:

jTextField1.setToolTipText("<html>" 
           + "Line One" 
           +"<br>" 
           + "Line 2" 
         + "</html>"); 
+0

Questo non risponde alla domanda del richiedente. Stava chiedendo del wrapping quando è visualizzato, non nel codice sorgente. – ArtB

+2

@ArtB questo codice di esempio fornisce una descrizione a due righe come richiesto. – Thelema

+0

@Thelema Ah, quindi in tal caso l'ho formattato come 'jTextField1.setToolTipText (" Line One
Riga 2 ");' – ArtB

2

Questo potrebbe essere migliorata un po ', ma il mio approccio è stato una funzione di supporto chiamata prima di tooltip che ha diviso il testo della descrizione comandi in condizione di lunghezza, ma regolato per rompere le parole sullo spazio, se possibile.

import java.util.ArrayList; 
import java.util.List; 

/** 
* 
*/ 
public class MultiLineTooltips 
{ 
    private static int DIALOG_TOOLTIP_MAX_SIZE = 75; 
    private static final int SPACE_BUFFER = 10; 

    public static String splitToolTip(String tip) 
    { 
     return splitToolTip(tip,DIALOG_TOOLTIP_MAX_SIZE); 
    } 
    public static String splitToolTip(String tip,int length) 
    { 
     if(tip.length()<=length + SPACE_BUFFER) 
     { 
      return tip; 
     } 

     List<String> parts = new ArrayList<>(); 

     int maxLength = 0; 
     String overLong = tip.substring(0, length + SPACE_BUFFER); 
     int lastSpace = overLong.lastIndexOf(' '); 
     if(lastSpace >= length) 
     { 
      parts.add(tip.substring(0,lastSpace)); 
      maxLength = lastSpace; 
     } 
     else 
     { 
      parts.add(tip.substring(0,length)); 
      maxLength = length; 
     } 

     while(maxLength < tip.length()) 
     { 
      if(maxLength + length < tip.length()) 
      { 
       parts.add(tip.substring(maxLength, maxLength + length)); 
       maxLength+=maxLength+length; 
      } 
      else 
      { 
       parts.add(tip.substring(maxLength)); 
       break; 
      } 
     } 

     StringBuilder sb = new StringBuilder("<html>"); 
     for(int i=0;i<parts.size() - 1;i++) 
     { 
      sb.append(parts.get(i)+"<br>"); 
     } 
     sb.append(parts.get(parts.size() - 1)); 
     sb.append(("</html>")); 
     return sb.toString(); 
    } 
} 

Usa come

jComponent.setToolTipText(MultiLineTooltips.splitToolTip(TOOLTIP)); 
1

Ecco una versione che ho usato prima, funziona bene se si sta caricando i tuoi suggerimenti utensili da ResourceBundles:

import javax.swing.JComponent; 
import javax.swing.JToolTip; 
import javax.swing.LookAndFeel; 
import javax.swing.UIManager; 
import javax.swing.plaf.ComponentUI; 
import javax.swing.plaf.ToolTipUI; 
import java.awt.Dimension; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.util.regex.Pattern; 

/** 
* A tooltip that wraps multi-line text. 
*/ 
public final class MultiLineToolTipUI extends ToolTipUI { 

    private static final int INSET = 2; 

    private static final Pattern LINE_SPLITTER = Pattern.compile("$", Pattern.MULTILINE); 

    private static final MultiLineToolTipUI SHARED_INSTANCE = new MultiLineToolTipUI(); 

    /** 
    * Install the multi-line tooltip into the UI manager. 
    */ 
    public static void installUI() { 
     String toolTipUI = MultiLineToolTipUI.class.getName(); 
     UIManager.put("ToolTipUI", toolTipUI); 
     UIManager.put(toolTipUI, MultiLineToolTipUI.class); 
    } 

    @SuppressWarnings("UnusedDeclaration") 
    public static ComponentUI createUI(JComponent c) { 
     return SHARED_INSTANCE; 
    } 

    private MultiLineToolTipUI() {} 

    @Override 
    public Dimension getMaximumSize(JComponent c) { 
     return getPreferredSize(c); 
    } 

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

    @Override 
    public Dimension getPreferredSize(JComponent c) { 
     String[] lines = LINE_SPLITTER.split(((JToolTip) c).getTipText()); 
     if (lines.length == 0) { 
      return new Dimension(2 * INSET, 2 * INSET); 
     } 
     FontMetrics metrics = c.getFontMetrics(c.getFont()); 
     Graphics g = c.getGraphics(); 
     int w = 0; 
     for (String line : lines) { 
      w = Math.max(w, (int) metrics.getStringBounds(line, g).getWidth()); 
     } 
     int h = lines.length * metrics.getHeight(); 
     return new Dimension(w + 2 * INSET, h + 2 * INSET); 
    } 

    @Override 
    public void installUI(JComponent c) { 
     LookAndFeel.installColorsAndFont(c, "ToolTip.background", "ToolTip.foreground", "ToolTip.font"); 
     LookAndFeel.installBorder(c, "ToolTip.border"); 
    } 

    @Override 
    public void paint(Graphics g, JComponent c) { 
     int w = c.getWidth(), h = c.getHeight(); 
     g.setColor(c.getBackground()); 
     g.fillRect(0, 0, w, h); 
     g.setColor(c.getForeground()); 
     g.drawRect(0, 0, w, h); 
     String[] lines = LINE_SPLITTER.split(((JToolTip) c).getTipText()); 
     if (lines.length != 0) { 
      FontMetrics metrics = c.getFontMetrics(c.getFont()); 
      int height = metrics.getHeight(); 
      int y = INSET + metrics.getAscent(); 
      for (String line : lines) { 
       g.drawString(line, INSET, y); 
       y += height; 
      } 
     } 
    } 

    @Override 
    public void uninstallUI(JComponent c) { 
     LookAndFeel.uninstallBorder(c); 
    } 

} 

E si userebbe chiamando questo metodo, prima che l'interfaccia utente venga creata:

MultiLineToolTipUI.installUI(); 

Quindi nei file delle proprietà è sufficiente inserire nuove righe per avvolgere i suggerimenti degli strumenti come desiderato.

17

So che questo è piuttosto vecchio ma ho trovato una soluzione abbastanza semplice utilizzando il codice HTML!

basta usare un paragrafo HTML con una larghezza fissa:

setToolTipText("<html><p width=\"500\">" +value+"</p></html>"); 
+0

Cosa fare se voglio visualizzare del testo che è molto più corto della dimensione del suggerimento? il tag "max-width" non funziona qui –

0

se si aggiunge solo <html> al testo tooltip, apparirà a lavorare fino ad avere /*...*/ o HTML nel testo. Utilizzare <html><pre> o sfuggire il testo. Ho anche dovuto usare <font size=3> per farlo sembrare un po 'decente.