Как центрировать строку (используя g.drawString) по центру экрана

Я пытаюсь найти разные способы центрирования текста в главном меню, которое я пытаюсь создать, но все способы, которые я пробовал, центрируют строку с первой буквы. Есть ли способ определить длину переданной строки, а затем определить ее центр?


person Jake Roper    schedule 21.07.2015    source источник
comment
Вы имеете в виду визуальное центрирование, которое будет зависеть от шрифта, которым отображается текст? Или вы имеете в виду по центру с равным количеством символов слева и справа от центра?   -  person shoover    schedule 22.07.2015
comment
Равное количество символов слева и справа.   -  person Jake Roper    schedule 22.07.2015
comment
Вы имеете в виду что-то вроде этого или это   -  person MadProgrammer    schedule 22.07.2015


Ответы (2)


Если вы используете JLabel, перегрузите конструктор, используя атрибут center. пример:

label = new JLabel("insert text here");

to

label = new JLabel("insert text here", SwingConstants.CENTER);
person sBourne    schedule 21.07.2015
comment
У меня есть строковая переменная, которая передается в drawString, которая затем рисуется на экране. Без участия лейблов. Любые другие идеи? На всякий случай попробую вашу идею с лейблом. - person Jake Roper; 22.07.2015
comment
Хм. Тогда не совсем уверен, как обойти хак вычисления длины. Может быть, попробуйте нарисовать в JLabel и отцентрировать его. - person sBourne; 22.07.2015
comment
@JakeRoper, No labels involved. - в этом суть. Почему вы не используете JLabel и соответствующий менеджер компоновки. Тогда вся работа по отображению текста и его центрированию будет сделана Swing и менеджером компоновки. - person camickr; 22.07.2015

Я написал это некоторое время назад.

/**
 * This method centers a <code>String</code> in 
 * a bounding <code>Rectangle</code>.
 * @param g - The <code>Graphics</code> instance.
 * @param r - The bounding <code>Rectangle</code>.
 * @param s - The <code>String</code> to center in the
 * bounding rectangle.
 * @param font - The display font of the <code>String</code>
 * 
 * @see java.awt.Graphics
 * @see java.awt.Rectangle
 * @see java.lang.String
 */
public void centerString(Graphics g, Rectangle r, String s, 
        Font font) {
    FontRenderContext frc = 
            new FontRenderContext(null, true, true);

    Rectangle2D r2D = font.getStringBounds(s, frc);
    int rWidth = (int) Math.round(r2D.getWidth());
    int rHeight = (int) Math.round(r2D.getHeight());
    int rX = (int) Math.round(r2D.getX());
    int rY = (int) Math.round(r2D.getY());

    int a = (r.width / 2) - (rWidth / 2) - rX;
    int b = (r.height / 2) - (rHeight / 2) - rY;

    g.setFont(font);
    g.drawString(s, r.x + a, r.y + b);
}
person Gilbert Le Blanc    schedule 21.07.2015