Infobulles multilignes en Java?

J’essaie d’afficher des info-bulles en Java qui peuvent être ou non des paragraphes. Comment puis-je encapsuler de longues info-bulles?

Si vous encapsulez l’info-bulle dans les balises et , vous pouvez casser les lignes avec des balises
. Voir http://www.jguru.com/faq/view.jsp?EID=10653 pour des exemples et des discussions.

Ou vous pouvez utiliser la classe JMultiLineToolTip qui peut être trouvée à de nombreux endroits sur le net, y compris https://github.com/ls-cwi/yoshiko-app/blob/master/src/main/java/com/yoshiko/internal/ voir / JMultiLineToolTip.java

Le texte de l’info-bulle qui commence par ” ” sera traité comme HTML. Bien sûr, cela pourrait être très large HTML.

Vous pouvez remplacer JComponent.createTooltip pour remplacer l’info-bulle par votre propre composant qui peut afficher ce que vous souhaitez.

Je sais que celui-ci est assez ancien mais j’ai trouvé une solution assez simple en utilisant du code HTML!

Utilisez simplement un paragraphe HTML avec une largeur fixe:

 setToolTipText("

" +value+"

");

Utilisez les info-bulles HTML et casser manuellement vos lignes (un simple outil de création de mots avec une longueur de ligne fixe devrait le faire). Assurez-vous que le texte de votre tooltop commence par ““. Briser les lignes avec “
” ou “

“. Je me rends compte que ce n’est pas la solution la plus propre et que le support HTML de Java est horrible, mais il devrait être efficace.

Exemple:

 jTextField1.setToolTipText("" + "Line One" +"
" + "Line 2" + "");

Vous pouvez sous-classer JToolTip, qui est un composant, et remplacer createToolTip () sur le composant.

Cela pourrait être quelque peu amélioré, mais mon approche était une fonction d’assistance appelée avant la définition de l’info-bulle qui divisait le texte de l’info-bulle en fonction de la longueur fournie, mais ajusté pour séparer les mots si possible.

 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 Ssortingng splitToolTip(Ssortingng tip) { return splitToolTip(tip,DIALOG_TOOLTIP_MAX_SIZE); } public static Ssortingng splitToolTip(Ssortingng tip,int length) { if(tip.length()< =length + SPACE_BUFFER ) { return tip; } List parts = new ArrayList<>(); int maxLength = 0; String overLong = tip.substring(0, length + SPACE_BUFFER); int lastSpace = overLong.lastIndexOf(' '); if(lastSpace >= length) { parts.add(tip.subssortingng(0,lastSpace)); maxLength = lastSpace; } else { parts.add(tip.subssortingng(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(""); for(int i=0;i"); } sb.append(parts.get(parts.size() - 1)); sb.append(("")); return sb.toSsortingng(); } } 

Utiliser comme

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

Voici une version que j’ai utilisée auparavant, elle fonctionne bien si vous chargez vos outils à partir de 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.FontMesortingcs; 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.comstack("$", Pattern.MULTILINE); private static final MultiLineToolTipUI SHARED_INSTANCE = new MultiLineToolTipUI(); /** * Install the multi-line tooltip into the UI manager. */ public static void installUI() { Ssortingng 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) { Ssortingng[] lines = LINE_SPLITTER.split(((JToolTip) c).getTipText()); if (lines.length == 0) { return new Dimension(2 * INSET, 2 * INSET); } FontMesortingcs mesortingcs = c.getFontMesortingcs(c.getFont()); Graphics g = c.getGraphics(); int w = 0; for (Ssortingng line : lines) { w = Math.max(w, (int) mesortingcs.getSsortingngBounds(line, g).getWidth()); } int h = lines.length * mesortingcs.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); Ssortingng[] lines = LINE_SPLITTER.split(((JToolTip) c).getTipText()); if (lines.length != 0) { FontMesortingcs mesortingcs = c.getFontMesortingcs(c.getFont()); int height = mesortingcs.getHeight(); int y = INSET + mesortingcs.getAscent(); for (Ssortingng line : lines) { g.drawSsortingng(line, INSET, y); y += height; } } } @Override public void uninstallUI(JComponent c) { LookAndFeel.uninstallBorder(c); } } 

Et vous l’utiliseriez en appelant cette méthode, avant la création de votre interface utilisateur:

 MultiLineToolTipUI.installUI(); 

Ensuite, dans vos fichiers de propriétés, insérez simplement de nouvelles lignes pour envelopper les info-bulles de votre choix.

J’ai créé une classe d’utilitaires qui formate automatiquement les chaînes sur une longueur spécifique avec des balises
. Il est basé sur la classe MultiLineToolTips publiée par Paul Taylor, mais il contient un bogue qui saute des parties de la chaîne et ne limite pas réellement la chaîne à une longueur spécifique.

Pour utiliser ma classe, appelez simplement la méthode splitToolTip en écrivant MultiLineToolTips.splitToolTip(yourSsortingng); ou MultiLineToolTips.splitToolTip(yourSsortingng, maxLength); si vous voulez le diviser à une longueur maximale spécifique. Cela créera des chaînes d’informations bien formatées.

 import java.util.ArrayList; import java.util.List; /** A helper class to split ssortingngs into a certain length, * formatted with html {@literal
} tags for multi-line tool tips. * Based on the MultiLineToolTips class posted by * Paul Taylor * on Stack Overflow * @author Andrew LeMaitre */ public final class MultiLineToolTips { /** Private constructor for utility class. */ private MultiLineToolTips() { } /** Default max length of the tool tip when split with {@link #splitToolTip(Ssortingng)}. */ private static final int DIALOG_TOOLTIP_MAX_SIZE = 75; /** A function that splits a ssortingng into sections of {@value #DIALOG_TOOLTIP_MAX_SIZE} characters or less. * If you want the lines to be shorter or longer call {@link #splitToolTip(Ssortingng, int)}. * @param toolTip The tool tip ssortingng to be split * @return the tool tip ssortingng with HTML formatting to break it into sections of the correct length */ public static Ssortingng splitToolTip(final Ssortingng toolTip) { return splitToolTip(toolTip, DIALOG_TOOLTIP_MAX_SIZE); } /** An overloaded function that splits a tool tip ssortingng into sections of a specified length. * @param toolTip The tool tip ssortingng to be split * @param desiredLength The maximum length of the tool tip per line * @return The tool tip ssortingng with HTML formatting to break it into sections of the correct length */ public static Ssortingng splitToolTip(final Ssortingng toolTip, final int desiredLength) { if (toolTip.length() < = desiredLength) { return toolTip; } List parts = new ArrayList<>(); int stringPosition = 0; while (stringPosition < toolTip.length()) { if (stringPosition + desiredLength < toolTip.length()) { String tipSubstring = toolTip.substring(stringPosition, stringPosition + desiredLength); int lastSpace = tipSubstring.lastIndexOf(' '); if (lastSpace == -1 || lastSpace == 0) { parts.add(toolTip.substring(stringPosition, stringPosition + desiredLength)); stringPosition += desiredLength; } else { parts.add(toolTip.substring(stringPosition, stringPosition + lastSpace)); stringPosition += lastSpace; } } else { parts.add(toolTip.substring(stringPosition)); break; } } StringBuilder sb = new StringBuilder(""); for (int i = 0; i < parts.size() - 1; i++) { sb.append(parts.get(i) + "
"); } sb.append(parts.get(parts.size() - 1)); sb.append(("")); return sb.toSsortingng(); } }

Si vous ajoutez simplement à votre texte d’info-bulle, cela semblera fonctionner jusqu’à ce que vous ayez /*...*/ ou HTML dans votre texte. Utilisez


ou échappez à votre texte. J'ai également dû utiliser pour le rendre assez décent.