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

4

我有以下代码来获取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的宽度?

1
“如何获取tooltipText的宽度?” 你为什么需要它? - Andrew Thompson
我在html中像这样格式化我的工具提示:“<html>第一行<Br>========<Br>第二行</html>”,我希望分隔线“=====”与第一行的长度匹配,以便看起来更漂亮,因此我需要第一行的宽度来决定要放多少个“=”符号到分隔线中。 - Frank
似乎需要在 第一行 下方加下划线或 <hr> 标签。无论哪种方式,都可以使用 CSS 进行进一步调整。您也可以考虑使用 CSS 限制宽度,而不是使用硬换行。 - Andrew Thompson
3个回答

2
您可以使用 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中默认外观的文档,例如Nimbus:

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


谢谢提供信息。但在我的情况下,如何在getToolTipText()方法内获取“graphics”实例,这就是我遇到困难的地方! - Frank
JComponent内部,您有getGraphics()方法。我认为您创建Graphics的方法更灵活(它可以在没有可用图形对象的情况下工作),但是使用组件的图形应该更有效率,因为它不必创建新的图像和图形对象。 - Joost

1

感谢您的回答,我已经弄清楚了,这是我所做的:

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");

1
我在HTML中这样形成我的工具提示:"<html>第一行<Br>========<Br>第二行</html>",我想让分隔线"====="与第一行的长度匹配,这样看起来更好看,..

考虑方案2和3,它们都不需要计算,并且比“等号行”更美观。

HTML ToolTip

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();
            }
        });
    }
}

太好了!我最终选择了<Hr>,有时候问一下“你为什么想这样做?”是很有帮助的。谢谢! - Frank
"选择了<Hr>",这是一个不错的选择。我更喜欢它而不是下划线。 :) - Andrew Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接