我试图在图形中写一个整数,并希望它定位在中心。
有没有办法这样做?
目前我写这篇文章并不好:
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是一个矩形。
答案 0 :(得分:5)
您可以使用FontMetrics类来确定要显示的String的确切大小,然后从中心点减去其X和Y维度的一半,并将其绘制在那里,如下所示:
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));
答案 1 :(得分:3)
我认为上述答案应该令人满意,但不准确。我不确定为什么,但事实就是如此。这就是我如何将面板上的任何对象/组件居中。但是使用字符串并不容易。可能它与文本的上升下降有关,这就是我很久以前在网上找到的一些代码所得到的。
代码见下文。它显示了一个非常简单的示例,展示了它与上述解决方案的工作原理,您只需要对相应的代码进行注释/取消注释,为每个变体运行一次程序并进行比较/查看。
我必须承认我不是算法的作者(遗憾的是我不记得他/她的名字 - 谢谢你的代码和好工作),虽然我已经实现了允许x和x的额外偏移的方法收率
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);
}
}
希望它有所帮助。
享受Java,Boro。