我生成了textpane。我需要在选择文本时替换文本,在点击上标按钮时,我需要标注文本。如果文本已经上标,则需要不对文本进行描述。我的问题是我能够上标文本,但无法恢复。我正在检查isSuperscript条件,但每次它返回值为true并将文本设置为上标。下面是我正在使用的代码,任何人都可以告诉我如何重置上标文本。
SimpleAttributeSet sasText = new SimpleAttributeSet(parentTextPane.getCharacterAttributes());
System.out.println("character set 1 " + sasText.toString());
if ( StyleConstants.isSuperscript(sasText) ){
System.out.println("already super");
StyleConstants.setSuperscript(sasText, false);
} else {
System.out.println("needs super");
StyleConstants.setSuperscript(sasText, true);
}
int caretOffset = parentTextPane.getSelectionStart();
parentTextPane.select(caretOffset, caretOffset + textLength);
HTMLDoc.setCharacterAttributes(selStart,textLength,sasText, false);
parentEkit.refreshOnUpdate();
答案 0 :(得分:1)
问题是parentTextPane.getCharacterAttributes()
将返回当前插入符号位置后的字符的字符属性。由于您的选择包含您的上标文本,因此以下字符是正常的。它是您正在测试的后续char的属性,结果将是false
。您可以选择执行getCharacterAttributes()
(来自JTextPane
):
public AttributeSet getCharacterAttributes() {
StyledDocument doc = getStyledDocument();
Element run = doc.getCharacterElement(getCaretPosition());
if (run != null) {
return run.getAttributes();
}
return null;
}
除了您想要返回选择的开头:
public AttributeSet getMyCharacterAttributes() {
StyledDocument doc = parentTextPane.getStyledDocument();
Element run = doc.getCharacterElement(parentTextPane.getSelectionStart());
if (run != null) {
return run.getAttributes();
}
return null;
}
然后您的代码将更改为执行以下操作:
SimpleAttributeSet sasText = new SimpleAttributeSet(getMyCharacterAttributes());
//... the rest of your code
答案 1 :(得分:0)
对我来说很好。我用以下代码进行快速测试:
SimpleAttributeSet green = new SimpleAttributeSet();
System.out.println( StyleConstants.isSuperscript(green) );
StyleConstants.setForeground(green, Color.GREEN);
StyleConstants.setSuperscript(green, true);
System.out.println( StyleConstants.isSuperscript(green) );
StyleConstants.setSuperscript(green, false);
System.out.println( StyleConstants.isSuperscript(green) );
并获得输出:
false
true
false
证明该属性正在被正确重置。文本也正确显示。
如果您的“sasText”在测试上标属性时始终返回true,那么您必须在代码中的其他位置重置该属性。
如果您需要更多帮助,请发布显示问题的SSCCE。