Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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
通过TextLayout和LineBreakMeasurer使用java2d用户空间测量_Java_Layout_Java 2d_Line Breaks - Fatal编程技术网

通过TextLayout和LineBreakMeasurer使用java2d用户空间测量

通过TextLayout和LineBreakMeasurer使用java2d用户空间测量,java,layout,java-2d,line-breaks,Java,Layout,Java 2d,Line Breaks,我在用户空间(mm)中定义了一个java2d图像来打印身份证。对像素的转换是使用所需DPI(屏幕或打印)的仿射变换 我想将文本换行,但文本布局不考虑用户空间坐标。我使用以下命令将包装文本写入区域: private void drawParagraph(Graphics2D g2d, Rectangle2D area, String text) { LineBreakMeasurer lineMeasurer; AttributedString string = new Attri

我在用户空间(mm)中定义了一个java2d图像来打印身份证。对像素的转换是使用所需DPI(屏幕或打印)的仿射变换

我想将文本换行,但文本布局不考虑用户空间坐标。我使用以下命令将包装文本写入区域:

private void drawParagraph(Graphics2D g2d, Rectangle2D area, String text) {
    LineBreakMeasurer lineMeasurer;
    AttributedString string = new AttributedString(text);
    AttributedCharacterIterator paragraph = string.getIterator();
    int paragraphStart = paragraph.getBeginIndex();
    int paragraphEnd = paragraph.getEndIndex();
    FontRenderContext frc = g2d.getFontRenderContext();
    lineMeasurer = new LineBreakMeasurer(paragraph, frc);

    float breakWidth = (float)area.getWidth();
    float drawPosY = (float)area.getY();
    float drawPosX = (float)area.getX();
    lineMeasurer.setPosition(paragraphStart);
    while (lineMeasurer.getPosition() < paragraphEnd) {
        TextLayout layout = lineMeasurer.nextLayout(breakWidth);

        drawPosY += layout.getAscent();
        layout.draw(g2d, drawPosX, drawPosY);

        drawPosY += layout.getDescent() + layout.getLeading();
    }        
}
当使用g2d.drawString(“一些要显示的文本”,x,y)时,字体大小显示正确


有人有更好的方法在用户空间中进行文本布局吗?

一开始调用
g2d.scale()
就应该这样做(我这样做的时候它工作了,我的代码基于完全相同的
LineBreakMeasurer
示例)。

一开始调用
g2d.scale()
就应该这样做(当我这样做时,它工作了,我的代码基于完全相同的
LineBreakMeasurer
示例)。

您在TextLayout上设置属性的位置?这是最重要的步骤,这里没有显示。我不确定您是否可以设置任何属性,因为它是使用LineBreakMeasurer创建的(while loop).LineBreakMeasurer的java文档说它不会转换为用户空间co ords。上面的代码是Sun教程代码中的教科书内容。我想知道是否有人知道其他方法可以这样做?您在TextLayout上设置属性的位置在哪里?这是最重要的步骤,这里没有显示。我不确定您是否可以n在使用LineBreakMeasurer(while循环)创建时设置任何属性。LineBreakMeasurer的java文档说它不会转换为用户空间的co ords。上面的代码是Sun教程代码中的教科书内容。我想知道是否有人知道另一种方法?
attr.put(TextAttribute.SIZE, (geTextArea().getHeight() / noOfLines - LINE_SPACING) );