0

我有一个 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);
}

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

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

在此处输入图像描述

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

4

2 回答 2

1

您可以使用以下两行代码之一来完成您想要做的事情:

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

  or

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

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

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

好消息是,如果您使用上述片段之一,则无需担心所有这些。希望有帮助。

于 2013-11-02T20:44:28.517 回答
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);

}
于 2018-03-15T01:22:45.880 回答