Bringer128 обнаружил проблему выше, но я просто уточню немного.
Когда стиль добавляется в JTextPane, строка, передаваемая в качестве аргумента, фактически помещается в стиль в качестве атрибута (что неудивительно, атрибут NameAttribute). Когда Стиль применяется к диапазону символов, NameAttribute применяется вместе со всеми другими Атрибутами, которые были установлены в Стиле. Поэтому, когда мой стиль BOLD был применен, каждый символ в этом диапазоне имел свой BoldAttribute, установленный в true, и его NameAttribute, установленный в "Bold". Затем, когда был применен мой стиль ITALIC, каждый символ имел свой ItalicAttribute, установленный в true, а затем его NameAttribute, установленный в "Italic". Затем, когда containsAttributes () проверило, все ли атрибуты в моем стиле BOLD были применены к этим символам, он вернул false, поскольку их атрибуты NameAttributes были изменены с «Bold» на «Italic». Надеюсь, это никого не смутило.
Вот моя работа (я думаю, что это на самом деле проще, чем оригинальный код). Суть в том, что я никогда не использую Styles или JTextPane.addStyle () вообще; Я просто держу константы MutableAttributeSets.
import javax.swing.JTextPane;
import javax.swing.text.StyleConstants;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
public class StyleBugFix {
public static void main(String[] args) {
JTextPane textPane = new JTextPane();
textPane.setText("This is a test string");
StyleConstants.setBold(BOLD, true);
StyleConstants.setItalic(ITALIC, true);
int start = 5;
int end = 10;
textPane.getStyledDocument().setCharacterAttributes(start, end - start, BOLD, false);
textPane.getStyledDocument().setCharacterAttributes(start, end - start, ITALIC, false);
for(int i = start; i < end; i++)
System.out.println(textPane.getStyledDocument().getCharacterElement(i).getAttributes()
.containsAttributes(BOLD)); //all now print true
}
private static final MutableAttributeSet BOLD = new SimpleAttributeSet();
private static final MutableAttributeSet ITALIC = new SimpleAttributeSet();
}
Еще раз спасибо Bringer128 за всю его помощь.