1

首先,我这样设置 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);

我错了?

4

3 回答 3

2

要设置 JTextPane 的样式,您可以使用样式表:查找 HtmlEditorKit#setStyleSheet

StyleSheet sh = editorKit.getStyleSheet();
sh.addRule("body {line-height: 50px}");
于 2013-08-13T09:24:18.730 回答
2

当您调用textPane.setParagraphAttributes(aSet, false); 它时,它会尝试将行距应用于选择,但未选择任何内容

用另一种方式称呼它

document.setParagraphAttributes(0, document.getLength(), attr, replace);
于 2013-08-13T09:41:21.990 回答
1

我一直在努力解决这个问题,然后在方法的 API 中public void setParagraphAttributes(AttributeSet attr, boolean replace),我发现了这个:

如果有选择,则属性将应用于与选择相交的段落。如果没有选择,则将属性应用于当前插入符号位置的段落。

所以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*(line height of text)代替当前行间距,而不是factor * original line spacing。够奇怪的。

如果JTextPane在 a 中JScrollPane并且文本的长度太长,它将滚动到最底部。通常我们希望看到顶部。要重置滚动的位置,最后你可以添加:

pane.setCaretPosition(0); //scroll to the top at last.

PS:要设置段落边距,我们有:

textPane.setMargin(new Insets(10, 5, 10, 5)); //top, left, bottom, right
于 2017-02-21T09:09:01.880 回答