2013-06-28 1 views
0

У меня есть JTextPane (или JEditorPane), в котором я хочу добавить некоторые кнопки для форматирования текста (как показано на рисунке).JTextPane - HTMLDocument: при добавлении/удалении нового стиля меняются и другие атрибуты

Когда я изменяю выделенный текст на Полужирный (создавая новый стиль), также изменяется семейство шрифтов (и другие атрибуты). Зачем? Я хочу установить (или удалить) жирный атрибут в выделенном тексте, а остальные остаются неизменными, как они были.

Это то, что я пытаюсь:

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

ответ

1

То, что вы пытаетесь сделать, может быть осуществлено одним из следующих двух строк кода:

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

or 

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

... где editorPane - это пример JEditorPane, конечно. Оба будут без проблем обходить любые атрибуты, уже определенные и поддерживающие выбор текста.

Что касается вашего кода, он не работает с ранее написанным текстом, потому что вы ничего не переписываете соответствующие атрибуты. Я имею в виду, вы никогда не собираете значения для атрибутов, уже установленных для текущего выделенного текста, используя, скажем, getAttributes() method. Таким образом, вы эффективно перезагружаете их по умолчанию, указанному в глобальной таблице стилей.

Хорошая новость: вам не нужно беспокоиться обо всем этом, если вы используете один из фрагментов выше. Надеюсь, это поможет.