Java中的多行工具提示?
我试图显示在Java中的工具提示可能或不可能是段落长度。 我怎样才能包装长工具提示?
如果您将工具提示封装在<html>
和</html>
标记中,则可以使用<br>
标记分行。 有关示例和讨论,请参见http://www.jguru.com/faq/view.jsp?EID=10653 。
或者你可以使用可以在网上find很多地方的JMultiLineToolTip类,包括http://code.ohloh.net/search?s=jmultilinetooltip
以“ <html>
”开头的工具提示文本将被视为HTML。 当然,这可能是非常广泛的HTML。
你可以重载JComponent.createTooltip来replace你自己的组件,它可以显示你喜欢的工具提示。
我知道这是一个相当古老的,但我find了一个相当简单的解决scheme,使用HTML代码!
只需使用固定宽度的HTML段落即可:
setToolTipText("<html><p width=\"500\">" +value+"</p></html>");
使用HTML工具提示和手动打破你的行(一个简单的词标记符具有固定的行长度应该这样做)。 只要确保您的tooltop文字以“<HTML>”开头。 用“<BR/>”或“<P>”断行。 我意识到这不是最干净的解决scheme,Java的HTML支持是可怕的,但它应该把事情做好。
例:
jTextField1.setToolTipText("<html>" + "Line One" +"<br>" + "Line 2" + "</html>");
您可以inheritance组件的JToolTip,并覆盖组件上的createToolTip()。
这可能会有所改善,但我的方法是在设置工具提示之前调用的帮助函数,该工具提示将工具提示文本分割为所提供的长度,但是被调整为在可能的情况下在空间上打破文字。
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); } }
你可以在你的UI创build之前通过调用这个方法来使用它:
MultiLineToolTipUI.installUI();
然后在你的属性文件中插入换行符来包装你的工具提示。
如果您只是将<html>
添加到您的工具提示文本中,它将显示工作,直到您的文本中有/*...*/
或HTML。 使用<html><pre>
或转义您的文本。 我也不得不使用<font size=3>
使它看起来有点体面。