如何在 Java Swing 中获取工具提示文本字符串的宽度?

Posted

技术标签:

【中文标题】如何在 Java Swing 中获取工具提示文本字符串的宽度?【英文标题】:How to get tooltip text string width in Java Swing? 【发布时间】:2012-06-13 18:31:30 【问题描述】:

我有以下几行来获取 JList 项的工具提示文本:

JList aList=new JList(aData)

  public String getToolTipText(MouseEvent evt)  // This method is called as the cursor moves within the list.
  
    String tooltipText="Some tooltip";
    int tooltipWidth= ?
    return tooltipText;
  

在getToolTipText()中,如何获取tooltipText的宽度?

【问题讨论】:

"如何获得 tooltipText 的宽度?" 为什么需要它? 我在 html 中形成我的工具提示,如下所示:“第一行========第二行”,我想要分隔线“=====”来匹配第一行的长度,这样看起来会更好,这就是为什么我需要第一行的宽度来决定在分隔线中放入多少个“=”。 它似乎需要first line 下方的下划线或<hr>。无论哪种方式,都可以使用 CSS 进一步调整。您可能还希望使用 CSS 来限制宽度,而不是使用硬换行符。 【参考方案1】:

您可以使用FontMetrics 来确定某些文本的大小。

FontMetrics metrics = graphics.getFontMetrics(font);
int adv = metrics.stringWidth(text);

http://docs.oracle.com/javase/tutorial/2d/text/measuringtext.html

要查找使用的字体,您可以查询您正在使用的LookAndFeel

UIDefaults uidefs = UIManager.getLookAndFeelDefaults();
Font font = uidefs.getFont("ToolTip.font");
System.out.println(font);
// prints: FontUIResource[family=Dialog,name=Dialog,style=plain,size=12]

要了解您可以使用的键(此处为“ToolTip.font”),您可以查看 Swing 中默认 LookAndFeels 的文档,例如 Nimbus:

http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html#primary

【讨论】:

感谢您的信息。但就我而言,如何在 getToolTipText() 方法中获取“图形”实例,这就是我遇到麻烦的地方! JComponent 中,您有getGraphics() 方法。我认为您创建Graphics 的方法更灵活(它适用于图形对象不可用的情况),但使用组件的图形应该更有效,因为它不必创建新图像一个图形对象【参考方案2】:

我在 html 中形成我的工具提示,如下所示:"<html>first line<Br>========<Br>second line</html>",我希望分隔线 "=====" 与第一行的长度相匹配,所以它看起来更好,..

考虑备选方案 2 和 3,这两个方案都不需要计算,而且看起来都比“等号行”更好。

import java.awt.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class HtmlToolTip 

    HtmlToolTip() 
        String attempt1 = "<html>first line 1<Br>========<Br>second line</html>";
        JLabel label1 = new JLabel(attempt1);
        label1.setBorder(new LineBorder(Color.BLACK));

        String attempt2 = "<html><u>first line 2</u><br>second line</html>";
        JLabel label2 = new JLabel(attempt2);
        label2.setBorder(new LineBorder(Color.BLACK));

        String attempt3 = "<html>first line 3<hr>second line</html>";
        JLabel label3 = new JLabel(attempt3);
        label3.setBorder(new LineBorder(Color.BLACK));

        JPanel p = new JPanel(new FlowLayout(FlowLayout.LEADING,5,5));
        p.add(label1);
        p.add(label2);
        p.add(label3);

        JOptionPane.showMessageDialog(null, p);
    

    public static void main(String[] args) throws Exception 
        SwingUtilities.invokeLater(new Runnable() 
            public void run() 
                new HtmlToolTip();
            
        );
    

【讨论】:

太棒了!我最终选择了
,有时问“你为什么要那样做?”会很有帮助。谢谢!
*"choose &lt;Hr&gt;" 这也是一个不错的选择。我更喜欢下划线。 :)【参考方案3】:

感谢答案,我想通了,这就是我所做的:

UIDefaults uidefs=UIManager.getLookAndFeelDefaults();
Font font=uidefs.getFont("ToolTip.font");
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
Graphics2D g2d=ge.createGraphics(new BufferedImage(1,1,1));
FontMetrics fontMetrics=g2d.getFontMetrics();
Top_Line_Width=fontMetrics.stringWidth("Toptip text");

【讨论】:

以上是关于如何在 Java Swing 中获取工具提示文本字符串的宽度?的主要内容,如果未能解决你的问题,请参考以下文章

java swing中怎么实现点击jframe的关闭按钮后,弹出提示框?

在 java awt 或 swing 中,如何安排键盘输入到鼠标所在的位置?

java swing中如何自行丢失焦点?已知怎样获取没找到如何丢失!

shell字符串处理

如何在 JPanel java swing 中移动标签

Java Swing 为输出创建一个文本区域