首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在graphic + java中定位字符串

在graphic + java中定位字符串
EN

Stack Overflow用户
提问于 2011-03-21 21:13:30
回答 2查看 3.7K关注 0票数 4

我试图在图形中写一个整数,并希望它的位置始终在中心。

有没有办法做到这一点?

目前我正在写这篇文章,这并不好:

代码语言:javascript
复制
Font font = new Font("Arial", Font.BOLD, 20);

g.setFont(font);
g.setColor(this.color);
g.fillOval(b.x, b.y, b.width, b.height);
g.setColor(Color.black);
g.drawString("1", b.x + b.width/2 , b.y+ b.height/2);

其中b是矩形。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-21 21:15:40

可以使用FontMetrics类确定要显示的字符串的确切大小,然后从中心点减去其X和Y维度的一半,并将其绘制在那里,如下所示:

代码语言:javascript
复制
    FontMetrics fm = g.getFontMetrics();
    Rectangle2D rect = fm.getStringBounds("1", g);
    g.drawString("1", (int) (b.x + b.width/2 - rect.getWidth()/2),
                      (int) (b.y + b.height/2 + rect.getHeight()/2));
票数 5
EN

Stack Overflow用户

发布于 2011-03-22 17:58:20

我认为上面的答案应该是令人满意的,尽管不是很精确。我不知道为什么,但事情就是这样。例如,这就是我在面板上将任何对象/组件居中的方式。但是使用字符串就没那么简单了。这可能与文本的上升下降有关,这是我很久以前在网上找到的一些代码。

有关代码,请参阅以下内容。它显示了一个非常简单的示例,展示了它与上述解决方案的工作方式,您只需注释/取消注释适当的代码,为每个变体运行一次程序,然后进行比较/查看。

我必须承认我不是算法的作者(遗憾的是我不记得他/她的名字了--谢谢你的代码&干得好),尽管我已经实现了允许x和y额外偏移的方法。

代码语言:javascript
复制
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.HeadlessException;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public final class StringPainter
{
    private StringPainter()
    {
    }

    public static void drawCenteredString(String s, int w, int h, Graphics g)
    {
        drawCenteredString(s, 0, 0, w, h, g);
    }

    public static void drawCenteredString(String s, int offsetX, int offsetY, int w, int h, Graphics g)
    {
        FontMetrics fm = g.getFontMetrics();
        int x = (w - fm.stringWidth(s)) / 2 + offsetX;
        int y = (fm.getAscent() + (h - (fm.getAscent() + fm.getDescent())) / 2) + offsetY;
        g.drawString(s, x, y);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createGUI();
            }
        });
    }

    private static void createGUI() throws HeadlessException
    {
        JPanel p = new JPanel()
        {
            private static final long serialVersionUID = 1L;

            @Override
            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                String str = "TEST";
//              StringPainter.drawCenteredString(str, 0, 0, getWidth(), getHeight(), g);
                FontMetrics fm = g.getFontMetrics();
                Rectangle2D rect = fm.getStringBounds(str, g);
                g.drawString(str, (int) (getX() + getWidth() / 2 - rect.getWidth() / 2),
                        (int) (getY() + getHeight() / 2 + rect.getHeight() / 2));
                g.setColor(Color.GREEN);
                g.fillOval(getWidth() / 2 - 2, getHeight() / 2 - 2, 4, 4);
            }
        };
        JFrame f = new JFrame();
        f.setContentPane(p);
        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

希望能有所帮助。

享受爪哇,波罗。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5378052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档