java,具有固定最大宽度的多行工具提示,使用 html 标签

Posted

技术标签:

【中文标题】java,具有固定最大宽度的多行工具提示,使用 html 标签【英文标题】:java, multiline tooltip with fixed max width, using html tag 【发布时间】:2013-11-29 06:52:21 【问题描述】:

我想在我的 swing 组件中添加多行工具提示消息。基本的解决方案是使用这样的html标签:

label.setToolTipText("<html><p width=\"350px\">" + text + "</p></html>");

它适用于长文本。但是如果文本,比如说,只包含一个单词,它也会有固定的 350px 宽度和很多空白空间。


max-width 是否有任何特殊的 html 属性可以与 setToolTipText() 方法一起正常工作? 我尝试了下一个解决方案,但它不起作用:

"<p style=\"max-width: 350px\">"

如果宽度小于 350 像素,我是否应该以像素为单位计算文本宽度并更改打开 &lt;p&gt; 标记?

【问题讨论】:

嗨 ferrerverck,您找到解决方案了吗? 【参考方案1】:

以下代码将动态设置工具提示的大小。

如果是单个单词,它会根据文本的像素大小来设置大小。 (不会有空白)。如果是大段落,则最大扩展至 350 像素,并以多行显示文本。

FontMetrics fontMetrics = label.getFontMetrics(label.getFont());
int length = fontMetrics.stringWidth(text);
label.setToolTipText("<html><p width=\"" + (length > 350 ? 350 : length) + "px\">" + text + "</p></html>\"");

Screenshot - Tooltip: Single word

Screenshot - Tooltip: Multiple words

Screenshot - Tooltip: Paragraph

【讨论】:

感谢您的回答,阿林丹!对于堆栈溢出的目的,带有代码且没有解释的答案通常不被认为是理想的。能否请您用英文描述您认为这如何解决问题以及它的作用? 感谢@SashaKondrashov 的建议。我已经添加了我的解释。 这个几乎是对的,问题是swing中的px并没有直接映射到swing长度。你想要 "pt" 而不是 "px" 。有关详细信息,请参阅以下内容:***.com/questions/56380978/…【参考方案2】:

你应该使用&lt;br/&gt;标签来下一行,像这样:

JButton button = new JButton("click me");
button.setToolTipText("<html>multy-line<br/>tool-tip</html>");

【讨论】:

【参考方案3】:

我喜欢用&lt;html&gt;&lt;p width 350px&gt;text&lt;/html&gt; 包裹工具提示文本的想法,但是一些建议的解决方案存在各种问题,最常见的是:1)总是使用任意宽度,2)使用整个文本的长度, 3) 使用错误的字体来计算所需的宽度。我提供以下解决这些问题的方法。

public final class HtmlTooltip 

private static int         sWrapLength  = 350;
private static FontMetrics sFontMetrics = new JLabel().getFontMetrics(UIManager.getFont("ToolTip.font"));

/**
 * Add HTML tags to force it to wrap at a defined length. <pre>@code
 *  component.setToolTipText(toString(text));
 * </pre>
 *
 * @param html
 *            String
 * @return update string ready to be used with setToolTipText
 * @see JComponent#setToolTipText(String)
 */
public static String toString(final String html) 
    final int length = sFontMetrics.stringWidth(longest(html));
    return String.format("<html><p width=%d\"pt\">%s</html>",
                         length > sWrapLength ? sWrapLength : length,
                         html);


/**
 * Given a complete HTML string, find the longest piece between tags.
 *
 * @param html
 *            String
 * @return longest piece
 */
private static String longest(final String html) 
    return Arrays.asList(html.split("<"))
                 .stream()
                 .max(Comparator.comparingInt(String::length))
                 .get();


private HtmlTooltip() 

【讨论】:

【参考方案4】:

定义一个自定义 BasicToolTipUI 并覆盖 getPreferredSize。如果文本包含“”,则应用所需宽度。随后将呈现 HTML。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案5】:

我建议如下:

设置固定宽度后,您可以使用以下方法获得首选尺寸:

Dimension d = someToolTip.getPreferredSize();
if (d.width < 350) 

    // Insert code to make tooltip-size smaller, by setting it to d.width;


【讨论】:

嗨卢克,如果您附上至少部分解决方案,您的想法将是有意义的。例如。在我的情况下,首选大小返回与固定大小相同的值,尽管它可以做得更少。要么你的意思是别的东西,要么你只是建议了想法而没有先检查它。 按您希望的方式设置工具提示,通过 getPreferredSize() 获取当前大小,然后设置该大小以防您希望它更小。所以手动改变宽度而不是设置最大值。

以上是关于java,具有固定最大宽度的多行工具提示,使用 html 标签的主要内容,如果未能解决你的问题,请参考以下文章

在 spark java 中读取具有固定宽度和分隔符的文本文件

Python Tkinter Treeview使用可变SQL查询固定宽度

将一行拆分为多行(固定宽度)

Java Swing:具有固定宽度和可变高度的垂直布局

在 R 中跨多行的固定宽度文件中读取观察结果

如何使用 QPlaintTextEdit 高效地创建固定宽度的列记录器?