我有一个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);
}
但正如我上面所解释的,其他属性也会发生变化:
任何帮助将不胜感激。提前谢谢!
答案 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);
}