1

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

例子

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

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

是否可以在屏幕上的画布中显示此内容并将其导出为 svg 或 pdf?我不知道有任何图书馆可以做到这一点。因此,我也很乐意通过这种方式收到一些建议/示例。

4

3 回答 3

1

关键是处理FontMetrics API。你能做的最好的就是查看这个参考文档

这是演示此用法的示例代码。它根据一系列字符在“Hello world”文本周围绘制红线和蓝线。

文本位于 JLabel 中,但您可以在任何组件上调整绘制方法(但您必须调用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

        }
    }
}
于 2013-02-25T13:25:43.383 回答
1

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

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

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

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

textPane.setIcon(myImageIcon);
于 2013-02-26T06:42:33.957 回答
0

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

编辑:您可以在 java 中显示 svg,您可以从 java 创建 pdf。您可以将其发布在网络上(只需 svg)。

于 2013-02-21T11:05:05.213 回答