【问题标题】:java, multiline tooltip with fixed max width, using html tagjava,具有固定最大宽度的多行工具提示,使用 html 标签
【发布时间】: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,您找到解决方案了吗?

标签: java html swing tooltip


【解决方案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" 。有关详细信息,请参阅以下内容:stackoverflow.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() 获取当前大小,然后设置该大小以防您希望它更小。所以手动改变宽度而不是设置最大值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 2019-07-31
      • 2019-03-02
      相关资源
      最近更新 更多