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

如何在JavaSwing中获取工具提示文本字符串宽度?,java,swing,text,width,tooltip,Java,Swing,Text,Width,Tooltip,我使用以下行获取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 tooltip

我使用以下行获取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;
  }
}

在getToolTiptText()中,如何获取ToolTiptText宽度?

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

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

要查找使用的字体,您可以查询您正在使用的
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:


多亏了这个答案,我才明白了,以下是我所做的:

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

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

import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.LineBorder;
公共类HTMLTOLTIP{
htmltoltip(){
字符串attempt1=“第一行1
================
第二行”; JLabel label1=新的JLabel(尝试1); label1.SetBeOrder(新线条边框(颜色为黑色)); 字符串attemt2=“第一行2
第二行”; JLabel label2=新的JLabel(尝试2); label2.SetBeOrder(新线条边框(颜色为黑色)); String attempt3=“第一行3
第二行”; JLabel label3=新的JLabel(尝试3); label3.SetBeOrder(新线条边框(颜色为黑色)); JPanel p=新的JPanel(新的FlowLayout(FlowLayout.LEADING,5,5)); p、 添加(标签1); p、 添加(标签2); p、 添加(标签3); showMessageDialog(null,p); } 公共静态void main(字符串[]args)引发异常{ SwingUtilities.invokeLater(新的Runnable(){ 公开募捐{ 新的htmltoltip(); } }); } }
“如何获得ToolTiptText宽度?”您为什么需要它?我用html格式的工具提示如下:“第一行
===========
第二行”,我希望分隔线“=====”与第一行的长度相匹配,这样它看起来更漂亮,这就是为什么我需要第一行的宽度来决定有多少“=”将的放入分隔行。它似乎需要在
第一行下方加下划线,或者在

下方加下划线。无论哪种方式,都可以使用CSS对其进行进一步调整。你也可以使用CSS来限制宽度,而不是使用硬线分隔符。谢谢你提供的信息。但是在我的例子中,如何在getToolTiptText()方法中获取“graphics”实例,这就是我遇到的问题!在
JComponent
中有
getGraphics()
方法。我认为您创建
图形的方法更灵活(它在图形对象不可用的情况下工作),但是使用组件的图形应该更有效率,因为它不必创建新图像图形对象太棒了!我最终选择了
,有时问“你为什么要这样做?”会有帮助,谢谢*“选择了

”这也是一个明智的选择。我更喜欢那个而不是下划线。:)