我有一个特定的文字,我想为用户注释。不幸的是,我甚至没有看到从哪里开始。我的算法在字符串上给出一个范围作为输出。我想要的是这样的:
我需要两种方法来标记角色(蓝线,红线),也可能需要反转角色(给角色一个不同的背景),或者让它们变胖。特别困难的是将图片(这里用两个黑点指定)与字符对齐。由于字符应该是Courier New,我可以知道在哪里放置偏移量,但我似乎无法做到。
最后,我必须在X个字符后应用一个中断并开始一个新行,就像在图片中一样。我还没有找到任何如何用java来解决这个问题的例子。使用python,我可以使用ImageDraw,但我与java无关。
是否可以在屏幕上的画布中显示此内容并将其导出为svg或pdf?我不知道任何可以做到这一点的图书馆。所以我很乐意接受一些建议/例子。
答案 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一样)。