Строка позиционирования в графике + Java - PullRequest
4 голосов
/ 21 марта 2011

Я пытаюсь написать целое число внутри графического рисунка и хочу, чтобы его расположение всегда было в центре.

Есть ли способ сделать это?

В настоящее время я пишуэто не хорошо:

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 - прямоугольник.

Ответы [ 2 ]

5 голосов
/ 21 марта 2011

Вы можете использовать класс FontMetrics, чтобы определить точный размер строки, которую вы хотите отобразить, а затем вычесть половину ее размеров 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));
3 голосов
/ 22 марта 2011

Я думаю, что приведенный выше ответ должен быть удовлетворительным, но не точным.Я не уверен почему, но так оно и есть.Таким образом, я бы, например, центрировал любой объект / компонент на панели.Но со струнами это не так просто.Вероятно, это как-то связано с всплывающим спуском текста, это то, что я получил из некоторого кода, который нашел в сети давным-давно.

Код см. Ниже.Он показывает очень простой пример, представляющий, как это работает, по сравнению с вышеупомянутым решением, вам просто нужно закомментировать / откомментировать соответствующий код, запустить программу один раз для каждого варианта и сравнить / посмотреть.

Должен признать, что я не являюсь автором алгоритма (к сожалению, я не помню его / ее имя - спасибо за код и хорошую работу), хотя я реализовал методы, позволяющие получить дополнительное смещение длях и у.

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

Надеюсь, это поможет.

Наслаждайтесь Явой, Боро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...