Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中绘制文本上方的线_Java_Graphics_Coordinates_Line - Fatal编程技术网

如何在Java中绘制文本上方的线

如何在Java中绘制文本上方的线,java,graphics,coordinates,line,Java,Graphics,Coordinates,Line,我想在Java文本上方画一条线。我使用图形,以下是我的代码: 字符串s=a.getSequent.toString; FontMetrics fm=getFontMetricsgetFont; int textHeight=fm.getHeight; int textWidth=fm.stringWidths; //正文 g、 抽绳, int jPanelWidth-textWidth/2, int jPanelHeight-text高度/2; //划线 int x1=jPanelWidth-t

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

字符串s=a.getSequent.toString; FontMetrics fm=getFontMetricsgetFont; int textHeight=fm.getHeight; int textWidth=fm.stringWidths; //正文 g、 抽绳, int jPanelWidth-textWidth/2, int jPanelHeight-text高度/2; //划线 int x1=jPanelWidth-textWidth/2; int x2=x1+文本宽度//问题 int y1=jPanelHeight-文本高度*4/2; int y2=y1; g、 抽绳X1、y1、x2、y2; 以下是我所拥有的:


我不明白为什么这行的长度和我的文本不一样。问题在于x2的值,但为什么?你能帮我个忙吗?

其中一个比较模糊的概念是理解文本的实际呈现方式

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

这意味着x/y位置实际上代表基线。。。只要花点时间再读一遍,如果没有帮助,就读一读

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


正如@luk2302所说,解决方案如下:

我有:FontMetrics fm=getFontMetricsgetFont

现在我有了:fontmetricsfm=getFontMetricsg.getFont


我没有使用正确的字体。

也许你用错了字体的宽度。也许尝试获取g.getFont的FontMetrics,而不仅仅是getFont-也许它们是不同的。就是这样!非常感谢。谢谢你的帮助,这将有助于我余下的项目!我使用的是图形,而不是Graphics2D,这有区别吗?一般来说,在Java中,任何系统生成的图形上下文实际上都是Graphics2D的实例
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();
        }

    }
}