10 ответов:
Если вы обернете подсказку в
<html>и</html>теги, вы можете разбить строки с<br>теги. См.http://www.jguru.com/faq/view.jsp?EID=10653 для примеров и обсуждения.или вы можете использовать класс JMultiLineToolTip, который можно найти во многих местах в сети, в том числе https://github.com/ls-cwi/yoshiko-app/blob/master/src/main/java/com/yoshiko/internal/view/JMultiLineToolTip.java
текст всплывающей подсказки, которая начинается с "
<html>" будет рассматриваться как HTML. Конечно, это может быть очень широкий HTML.можно переопределить JComponent.createTooltip чтобы заменить подсказку с вашим собственным компонентом, который может отображать то, что вам нравится.
Я знаю, что это довольно старый, но я нашел довольно простое решение с помощью HTML-кода!
просто используйте HTML-абзац с фиксированной шириной:
setToolTipText("<html><p width=\"500\">" +value+"</p></html>");
используйте подсказки HTML и вручную разбивайте свои строки (это должен сделать простой токенизатор слов с фиксированной длиной строки). Просто убедитесь, что ваш текст tooltop начинается с "". Ломайте линии с помощью "
"или"". Я понимаю, что это не самое чистое решение, и поддержка HTML Java ужасна, но это должно быть сделано.
вы можете подкласс JToolTip, который является компонентом, и переопределить createToolTip() на компоненте.
Это можно было бы несколько улучшить, но мой подход был вспомогательной функцией, вызываемой перед установкой tooltip, которая разбивает текст подсказки на заданную длину, но настраивается для разбиения слов на пространстве, где это возможно.
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(); } }как
jComponent.setToolTipText(MultiLineTooltips.splitToolTip(TOOLTIP));
вот версия, которую я использовал раньше, она хорошо работает, если вы загружаете свои подсказки из 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); } }и вы бы использовали его, вызвав этот метод, прежде чем ваш пользовательский интерфейс будет создан:
MultiLineToolTipUI.installUI();затем в ваших файлах свойств просто вставьте новые строки, чтобы обернуть ваши подсказки по желанию.
Я создал вспомогательный класс, который автоматически форматирует строки до определенной длины с
<br>теги. Он основан на классе MultiLineToolTips, опубликованном полом Тейлором, но в нем есть ошибка, которая пропускает части строки и фактически не ограничивает строку определенной длиной.чтобы использовать мой класс, просто вызовите метод splitToolTip, написав
MultiLineToolTips.splitToolTip(yourString);илиMultiLineToolTips.splitToolTip(yourString, maxLength);Если вы хотите разделить его на определенную максимальную длину. Это создаст красиво отформатированную подсказку веревка.import java.util.ArrayList; import java.util.List; /** A helper class to split strings into a certain length, * formatted with html {@literal<br>} tags for multi-line tool tips. * Based on the MultiLineToolTips class posted by * <a href="https://stackoverflow.com/users/1480018/paul-taylor">Paul Taylor</a> * on <a href="https://stackoverflow.com/a/13503677/9567822">Stack Overflow</a> * @author <a href="https://stackoverflow.com/users/9567822/andrew-lemaitre?tab=profile">Andrew LeMaitre</a> */ public final class MultiLineToolTips { /** Private constructor for utility class. */ private MultiLineToolTips() { } /** Default max length of the tool tip when split with {@link #splitToolTip(String)}. */ private static final int DIALOG_TOOLTIP_MAX_SIZE = 75; /** A function that splits a string into sections of {@value #DIALOG_TOOLTIP_MAX_SIZE} characters or less. * If you want the lines to be shorter or longer call {@link #splitToolTip(String, int)}. * @param toolTip The tool tip string to be split * @return the tool tip string with HTML formatting to break it into sections of the correct length */ public static String splitToolTip(final String toolTip) { return splitToolTip(toolTip, DIALOG_TOOLTIP_MAX_SIZE); } /** An overloaded function that splits a tool tip string into sections of a specified length. * @param toolTip The tool tip string to be split * @param desiredLength The maximum length of the tool tip per line * @return The tool tip string with HTML formatting to break it into sections of the correct length */ public static String splitToolTip(final String toolTip, final int desiredLength) { if (toolTip.length() <= desiredLength) { return toolTip; } List<String> 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("<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(); } }
если вы просто добавить
<html>в текст подсказки, он будет работать, пока у вас есть/*...*/или HTML в вашем тексте. Используйте<html><pre>или экранировать текст. Я также должен был использовать<font size=3>чтобы он выглядел несколько прилично.
Comments