首页 > 解决方案 > 如何在Java中的文本上方画线

问题描述

我想在 Java 中的文本上方画一条线。我使用图形,这是我的代码:

String s = a.getSequent().toString();
FontMetrics fm = getFontMetrics(getFont());
int textHeight = fm.getHeight();
int textWidth= fm.stringWidth(s);

//Text
g.drawString( s,
        (int) ((jPanelWidth- textWidth) / 2),
        (int) ((jPanelHeight- textHeight ) / 2));

//Draw line
int x1 = (jPanelWidth- textWidth) / 2;
int x2 = x1 + textWidth; //Problem
int y1 = (jPanelHeight- textHeight *4) / 2;
int y2 = y1;
g.drawLine(x1, y1, x2, y2);

这是我所拥有的:

在此处输入图像描述

我不明白为什么该行与我的文本长度不同。问题在于 x2 的值,但为什么呢?你可以帮帮我吗 ?

标签: javagraphicscoordinatesline

解决方案


要掌握的比较模糊的概念之一是了解文本的实际呈现方式。

文本不是从 x/y 位置向下渲染,而是从基线向上渲染。

文本基线

这意味着 x/y 位置实际上代表基线......只需花一些时间再阅读一遍,如果没有帮助,请阅读测量文本

基本概念是,您要取代表基线的 x/y 位置,然后减去上升

例如

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g.create();

            g2d.setColor(Color.RED);
            g2d.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());
            g2d.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);

            String text = "This is a test";
            FontMetrics fm = g2d.getFontMetrics();

            int textHeight = fm.getHeight();
            int textWidth = fm.stringWidth(text);

            int xPos = (getWidth() - textWidth) / 2;
            int yPos = ((getHeight() - textHeight) / 2) + fm.getAscent();

            g2d.setColor(Color.BLACK);
            g2d.drawString(text, xPos, yPos);

            g2d.drawLine(xPos, yPos - fm.getAscent(), xPos + textWidth, yPos - fm.getAscent());

            g2d.dispose();
        }

    }
}

推荐阅读