SWING: невозможно сбросить верхний индекс шрифта - PullRequest
2 голосов
/ 11 февраля 2010

У меня генерируется текстовое поле. мне нужно надписать текст, когда текст выделен и во время нажатия надстрочной кнопки, мне нужно надстрочный текст. если текст уже надстрочный, необходимо отменить текст. Моя проблема в том, что я могу надписать текст, но не могу восстановить обратно. Я проверяю условие 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 ]

1 голос
/ 11 февраля 2010

Проблема в том, что parentTextPane.getCharacterAttributes() вернет атрибуты символа для персонажа после текущей позиции каретки. Поскольку ваш выбор включает в себя текст надстрочного индекса, следующий символ является нормальным. Это атрибуты для этого следующего символа, который вы тестируете, и результат будет 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
0 голосов
/ 11 февраля 2010

У меня отлично работает. Я делаю быстрый тест с кодом вроде:

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 с указанием проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...