Я думаю, что приведенный выше ответ должен быть удовлетворительным, но не точным.Я не уверен почему, но так оно и есть.Таким образом, я бы, например, центрировал любой объект / компонент на панели.Но со струнами это не так просто.Вероятно, это как-то связано с всплывающим спуском текста, это то, что я получил из некоторого кода, который нашел в сети давным-давно.
Код см. Ниже.Он показывает очень простой пример, представляющий, как это работает, по сравнению с вышеупомянутым решением, вам просто нужно закомментировать / откомментировать соответствующий код, запустить программу один раз для каждого варианта и сравнить / посмотреть.
Должен признать, что я не являюсь автором алгоритма (к сожалению, я не помню его / ее имя - спасибо за код и хорошую работу), хотя я реализовал методы, позволяющие получить дополнительное смещение длях и у.
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);
}
}
Надеюсь, это поможет.
Наслаждайтесь Явой, Боро.