2013-06-28 55 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爲當前選定文本設置的屬性收集值。所以,你有效地將它們重置爲全局樣式表指定的默認值。

好消息是,如果您使用上面的代碼片段之一,則無需擔心所有這些問題。希望有所幫助。

相關問題