使用java格式化:混合文本和图片

时间:2013-02-21 11:00:40

标签: java drawing format

我有一个特定的文字,我想为用户注释。不幸的是,我甚至没有看到从哪里开始。我的算法在字符串上给出一个范围作为输出。我想要的是这样的:

example

我需要两种方法来标记角色(蓝线,红线),也可能需要反转角色(给角色一个不同的背景),或者让它们变胖。特别困难的是将图片(这里用两个黑点指定)与字符对齐。由于字符应该是Courier New,我可以知道在哪里放置偏移量,但我似乎无法做到。

最后,我必须在X个字符后应用一个中断并开始一个新行,就像在图片中一样。我还没有找到任何如何用java来解决这个问题的例子。使用python,我可以使用ImageDraw,但我与java无关。

是否可以在屏幕上的画布中显示此内容并将其导出为svg或pdf?我不知道任何可以做到这一点的图书馆。所以我很乐意接受一些建议/例子。

3 个答案:

答案 0 :(得分:1)

关键是要处理FontMetrics API。你能做的最好的就是看reference doc

以下是演示此用法的示例代码。它在" Hello world"周围画出红线和蓝线。根据一系列字符发短信。

文本在JLabel中,但您可以在任何组件上调整paint方法(但是您必须调用graphics.drawChars来绘制文本。)

(代码不是很好,但它演示了FontMetrics的用法)

package com.example.swing;

import javax.swing.*;
import java.awt.*;

public class DemoFontMetrics {

    public static void main(String[] args){
        JFrame frame = new JFrame();
        DecoratedLabel label = new DecoratedLabel("hello world !",new int[]{2,4}, new int[]{6,9});
        JPanel textContainer = new JPanel(new FlowLayout());
        textContainer.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
        textContainer.add(label);
        frame.getContentPane().add(textContainer);
        frame.pack();
        frame.setVisible(true);
    }

    private static class DecoratedLabel extends JLabel{

        int startBlue;
        int endBlue;
        int startRed;
        int endRed;

        private DecoratedLabel(String text, int[] blueRange, int[] redRange) {
            super(text);
            startBlue = blueRange[0];
            endBlue = blueRange[1];
            startRed = redRange[0];
            endRed = redRange[1];
        }

        @Override
        public void paint(Graphics g) {
            super.paint(g);   //draw text

            //set line with : 3
            Stroke stroke = new BasicStroke(3f);
            ((Graphics2D)g).setStroke(stroke);

            FontMetrics fm = g.getFontMetrics();
            int h = fm.getHeight();

            //compute blue line coordonate
            fm.stringWidth(getText().substring(0,startBlue));
            int x1 = fm.stringWidth(getText().substring(0, startBlue));
            int x2 = fm.stringWidth(getText().substring(0, endBlue));
            g.setColor(Color.BLUE);
            g.drawLine(x1,0,x2,0);// draw blue line

            //compute red line coordonates
            int x3 = fm.stringWidth(getText().substring(0,startRed));
            int x4 = fm.stringWidth(getText().substring(0, endRed));
            g.setColor(Color.RED);
            g.drawLine(x3,h-1,x4,h-1); // draw redline

        }
    }
}

答案 1 :(得分:1)

如果通过JTextPane显示文字,您可以方便地定义自定义HighlightPainter,在文字上方或下方绘制线条。

然后,您可以通过调用以下方式以编程方式向文本窗格添加高亮显示:

textPane.getHighlighter().addHighlight(startPos, endPos, 
        myLineHighlightPainter);

图片也可以通过以下方式轻松添加到窗格中:

textPane.setIcon(myImageIcon);

答案 2 :(得分:0)

您可以直接创建svg,例如:http://xmlgraphics.apache.org/batik/它是基于xml的矢量图形格式。

编辑:你可以在java中显示svg,你可以用java创建pdf。您可以在网上发布它(就像svg一样)。