JTextPane getBaseline方法返回-1

时间:2015-04-13 13:50:13

标签: java swing fonts jtextpane

我在JTextPane中绘制了一个textlayout。但是我无法为y轴获得textlayout的正确位置。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;

import javax.swing.JTextPane;

public class CustomTextPane extends JTextPane {
    private final Font myFont = new Font(Font.SANS_SERIF, Font.PLAIN, 16);

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

        //Drawing hint text

        Graphics2D g2 = (Graphics2D) g.create();
        FontRenderContext frc = g2.getFontRenderContext();
        TextLayout jTextLayout = new TextLayout("My Text", myFont, frc);
        g2.setPaint(Color.BLACK);
        int nBaseLine = getBaseline(getWidth(), getHeight());
        jTextLayout.draw(g2, 10, nBaseLine);

        g2.dispose();
    }
}

getBaseline方法为JTextPane返回-1。

但是当我以这种方式使用JTextField时,getBaseLine方法会获得正确的值。

为什么基线方法返回-1?如何获得正确的基线值以在正确的位置绘制textlayout?

1 个答案:

答案 0 :(得分:0)

正如camickr已经评论过的那样,单行文本的基线比可以包含多行文本(JTextPane)的矩形更有意义。

当您为getBaseline调用JTextField方法时,会调用JComponent.getBaseline方法,从而调用BasicTextFieldUI.getBaseline方法。在最后一种方法中,实际计算了基线。

当您为getBaseline调用JTextPane方法时,它会调用JComponent.getBaseline方法,最终会调用ComponentUI.getBaseline方法。这里检查三个参数。如果其中一个参数不正确,则抛出异常;否则,返回值-1。