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 像素,我是否应该以像素为单位计算文本宽度并更改打开 <p>
标记?
【问题讨论】:
嗨 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】:你应该使用<br/>
标签来下一行,像这样:
JButton button = new JButton("click me");
button.setToolTipText("<html>multy-line<br/>tool-tip</html>");
【讨论】:
【参考方案3】:我喜欢用<html><p width 350px>text</html>
包裹工具提示文本的想法,但是一些建议的解决方案存在各种问题,最常见的是: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 中读取具有固定宽度和分隔符的文本文件