SWING:无法重置字体上标

时间:2010-02-10 22:14:08

标签: java swing

我生成了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();

2 个答案:

答案 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