首先,我像这样设置 JTextPane:
HTMLEditorKit editorKit = new HTMLEditorKit();
HTMLDocument document = (HTMLDocument) editorKit.createDefaultDocument();
JTextPane textPane = new JTextPane();
textPane.setContentType("text/html");
textPane.setDocument(document);
我想在 JtextPane 中设置行间距,这是我的想法,但它不起作用:
SimpleAttributeSet aSet = new SimpleAttributeSet();
StyleConstants.setLineSpacing(aSet, 50);
textPane.setParagraphAttributes(aSet, false);
我错了?
当你打电话时
textPane.setParagraphAttributes(aSet, false);
它尝试将行距应用于选择,但没有选择任何内容
换个说法
document.setParagraphAttributes(0, document.getLength(), attr, replace);
要设置 JTextPane 的样式,您可以使用样式表:查找 HtmlEditorKit#setStyleSheet
StyleSheet sh = editorKit.getStyleSheet();
sh.addRule("body {line-height: 50px}");
我一直在努力解决这个问题,然后在方法
public void setParagraphAttributes(AttributeSet attr, boolean replace)
的API中,我发现了这个:
如果有选区,则属性将应用于与选区相交的段落。如果没有选择,属性将应用于当前插入符号位置的段落。
所以OP的方法是可行的,但是你必须在设置行距之前应用
textPane.selectAll()
。你只需要做一次,所有附加到这个JTextPane
的文本将具有相同的行距,即使设置行距时窗格中可能没有文本。我在实例化它时执行此操作。
因此对我有用的代码是:
/**
* Select all the text of a <code>JTextPane</code> first and then set the line spacing.
* @param the <code>JTextPane</code> to apply the change
* @param factor the factor of line spacing. For example, <code>1.0f</code>.
* @param replace whether the new <code>AttributeSet</code> should replace the old set. If set to <code>false</code>, will merge with the old one.
*/
private void changeLineSpacing(JTextPane pane, float factor, boolean replace) {
pane.selectAll();
MutableAttributeSet set = new SimpleAttributeSet(pane.getParagraphAttributes());
StyleConstants.setLineSpacing(set, factor);
txtAtributosImpresora.setParagraphAttributes(set, replace);
}
注意:它将用 factor*(文本行高) 替换当前行距,而不是 factor * 原始行距。够奇怪的。
如果
JTextPane
在JScrollPane
中并且文本长度太长,它会滚动到最底部。通常我们想看到顶部。要重置滚动的位置,最后你可以添加:
pane.setCaretPosition(0); //scroll to the top at last.
P.S.:要设置段落边距,我们有:
textPane.setMargin(new Insets(10, 5, 10, 5)); //top, left, bottom, right
更改行距之前设置字体和文档:
private void changeLineSpacing(JTextPane pane) {
SimpleAttributeSet set = new SimpleAttributeSet(pane.getParagraphAttributes());
StyleConstants.setLineSpacing(set, 0.5F);
pane.setParagraphAttributes(set, true);
}