Java 测量Swing图形中的文本边界2d

Java 测量Swing图形中的文本边界2d,java,swing,graphics2d,Java,Swing,Graphics2d,我正在使用这种方法测量Swing图形中的文本边界 但它并没有涵盖整个文本。 它特别适用于测量高度。。。 当我输入英文文本时效果会更好,但我应该使用波斯语字体 这就是我绘制文本和边界的方式: g.drawString(text, x-textBounds.width/2, y+textBounds.height/2); g.drawRect(x-textBounds.width/2, y-textBounds.height/2, textBounds.width, textBounds.heig

我正在使用这种方法测量Swing图形中的文本边界 但它并没有涵盖整个文本。 它特别适用于测量高度。。。 当我输入英文文本时效果会更好,但我应该使用波斯语字体

这就是我绘制文本和边界的方式:

g.drawString(text, x-textBounds.width/2, y+textBounds.height/2);
g.drawRect(x-textBounds.width/2, y-textBounds.height/2, textBounds.width, textBounds.height);

这里有两种获得完整字体的方法。我只是从互联网上抓取了一些随机的波斯语文本,因为OP懒得贴一个小例子

public class BoxInFont {
    String text = "سادگی، قابلیت تبدیل";
    int ox = 50;
    int oy = 50;
    void buildGui(){
        JFrame frame = new JFrame("Boxed In Fonts");

        JPanel panel = new JPanel(){
            @Override
            protected void paintComponent(Graphics g){
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D)g;
                g.drawString(text, ox, oy);
                Font f = g.getFont();
                Rectangle2D charBounds = f.getStringBounds(text, g2d.getFontRenderContext());
                GlyphVector gv = f.layoutGlyphVector(g2d.getFontRenderContext(), text.toCharArray(), 0, text.length(), GlyphVector.FLAG_MASK);
                Rectangle2D bounds = gv.getVisualBounds();
                g2d.translate(ox, oy);
                //g2d.drawRect((int)bounds.getX() + ox, (int)bounds.getY() + oy, (int)bounds.getWidth(), (int)bounds.getHeight());
                g2d.draw(bounds);
                g2d.draw(charBounds);
                System.out.println("vis: " + bounds);
                System.out.println("char: "  + charBounds);
            }
        };
        frame.add(panel);
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }


    public static void main(String[] args){

        EventQueue.invokeLater(()->new BoxInFont().buildGui());

    }
}
绘制的两个框都完全封装了文本。我认为视觉界限更适合

OP的问题在于,他们忽略了返回的矩形的x和y值。他们只使用宽度和高度。如果你看这个程序的输出,你可以看到x和y不是0

可视信息: java.awt.geom.Rectangle2D$Float[x=-0.2056962,y=-9.814648,w=96.76176,h=13.558318] 烧焦: java.awt.geom.Rectangle2D$Float[x=0.0,y=-12.568359,w=97.0,h=15.310547]


这里有两种获得完整字体的方法。我只是从互联网上抓取了一些随机的波斯语文本,因为OP懒得贴一个小例子

public class BoxInFont {
    String text = "سادگی، قابلیت تبدیل";
    int ox = 50;
    int oy = 50;
    void buildGui(){
        JFrame frame = new JFrame("Boxed In Fonts");

        JPanel panel = new JPanel(){
            @Override
            protected void paintComponent(Graphics g){
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D)g;
                g.drawString(text, ox, oy);
                Font f = g.getFont();
                Rectangle2D charBounds = f.getStringBounds(text, g2d.getFontRenderContext());
                GlyphVector gv = f.layoutGlyphVector(g2d.getFontRenderContext(), text.toCharArray(), 0, text.length(), GlyphVector.FLAG_MASK);
                Rectangle2D bounds = gv.getVisualBounds();
                g2d.translate(ox, oy);
                //g2d.drawRect((int)bounds.getX() + ox, (int)bounds.getY() + oy, (int)bounds.getWidth(), (int)bounds.getHeight());
                g2d.draw(bounds);
                g2d.draw(charBounds);
                System.out.println("vis: " + bounds);
                System.out.println("char: "  + charBounds);
            }
        };
        frame.add(panel);
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }


    public static void main(String[] args){

        EventQueue.invokeLater(()->new BoxInFont().buildGui());

    }
}
绘制的两个框都完全封装了文本。我认为视觉界限更适合

OP的问题在于,他们忽略了返回的矩形的x和y值。他们只使用宽度和高度。如果你看这个程序的输出,你可以看到x和y不是0

可视信息: java.awt.geom.Rectangle2D$Float[x=-0.2056962,y=-9.814648,w=96.76176,h=13.558318] 烧焦: java.awt.geom.Rectangle2D$Float[x=0.0,y=-12.568359,w=97.0,h=15.310547]


你缺少补偿。您是否尝试使用,
gv.getVisualBounds
?还有,您是如何显示矩形/文本的?你能包含一段你想修复的文字吗?@matt“你是如何显示矩形/文字的?”我编辑了这篇文章,并添加了我的方式。。。“你试过使用,gv.getVisualBounds吗?”gv.getVisualBounds也有错误的高度,并且有相同的问题…你能添加一段文本吗?对我来说,get VisualBounds封装了文本,包括下降到基线以下的文本。你缺少偏移量。您是否尝试使用,
gv.getVisualBounds
?还有,您是如何显示矩形/文本的?你能包含一段你想修复的文字吗?@matt“你是如何显示矩形/文字的?”我编辑了这篇文章,并添加了我的方式。。。“你试过使用,gv.getVisualBounds吗?”gv.getVisualBounds也有错误的高度和相同的问题…你能添加一段文本吗?对我来说,get VisualBounds封装了文本,包括下降到基线以下的文本。