JTextPane - HTMLDocument:添加/删除新样式时,其他属性也会更改

时间:2013-06-28 11:05:07

标签: java styles jtextpane jeditorpane dom

我有一个JTextPane(或JEditorPane),我想在其中添加一些按钮来格式化文本(如图所示)。

当我将所选文本更改为粗体(制作新样式)时,字体系列(以及其他属性)也会更改。为什么?我想设置(或删除)所选文本中的粗体属性,其他保持不变,原样。

这就是我正在尝试的:

private void setBold(boolean flag){
    HTMLDocument doc = (HTMLDocument) editorPane.getDocument();
    int start = editorPane.getSelectionStart();
    int end = editorPane.getSelectedText().length();

    StyleContext ss = doc.getStyleSheet();

    //check if BoldStyle exists and then add / remove it
    Style style = ss.getStyle("BoldStyle");                       
    if(style == null){
        style = ss.addStyle("BoldStyle", null);
        style.addAttribute(StyleConstants.Bold, true);
    } else {                
        style.addAttribute(StyleConstants.Bold, false);
        ss.removeStyle("BoldStyle");
    }

    doc.setCharacterAttributes(start, end, style, true);
}

但正如我上面所解释的,其他属性也会发生变化:

任何帮助将不胜感激。提前谢谢!

enter image description here

http://oi40.tinypic.com/riuec9.jpg

2 个答案:

答案 0 :(得分:1)

您尝试执行的操作可以使用以下两行代码之一完成:

new StyledEditorKit.BoldAction().actionPerformed(null);

  or

editorPane.getActionMap().get("font-bold").actionPerformed(null);

...其中editorPane当然是JEditorPane的一个实例。 两者都将无缝地处理已定义的任何属性并支持文本选择。

关于您的代码,它不适用于以前设置样式的文本,因为您没有任何内容覆盖相应的属性。我的意思是,您永远不会使用getAttributes() method收集已为当前所选文本设置的属性的值。因此,您实际上将它们重置为全局样式表指定的默认值。

好消息是,如果你使用上面的一个片段,你不需要担心这一切。希望有所帮助。

答案 1 :(得分:0)

我对您的代码做了一些小修改,它在这里工作:

private void setBold(boolean flag){
    HTMLDocument doc = (HTMLDocument) editorPane.getDocument();

    int start = editorPane.getSelectionStart();
    int end = editorPane.getSelectionEnd();

    if (start == end) {
        return;
    }

    if (start > end) {
        int life = start;
        start = end;
        end = life;
    }

    StyleContext ss = doc.getStyleSheet();

    //check if BoldStyle exists and then add / remove it
    Style style = ss.getStyle(editorPane.getSelectedText());                       
    if(style == null){
        style = ss.addStyle(editorPane.getSelectedText(), null);
        style.addAttribute(StyleConstants.Bold, true);
    } else {                
        style.addAttribute(StyleConstants.Bold, false);
        ss.removeStyle(editorPane.getSelectedText());
    }

    doc.setCharacterAttributes(start, end - start, style, true);

}