我一直在我编写的应用程序中使用JTextPane(或我的子类版本),因此我一直在使用Styles。我的程序没有按照我想要的方式运行,并且我将行为跟踪到我认为是AttributeSet.containsAttributes(AttributeSet attribute)方法中的错误的地方。我编写了以下简短程序进行说明:
import javax.swing.JTextPane;
import javax.swing.text.StyleConstants;
import javax.swing.text.Style;
public class StyleBug {
public static void main(String[] args) {
JTextPane textPane = new JTextPane();
textPane.setText("This is a test string");
Style bold = textPane.addStyle(BOLD, null);
StyleConstants.setBold(bold, true);
Style italic = textPane.addStyle(ITALIC, null);
StyleConstants.setItalic(italic, true);
int start = 5;
int end = 10;
textPane.getStyledDocument().setCharacterAttributes(start, end - start, textPane.getStyle(BOLD), false);
textPane.getStyledDocument().setCharacterAttributes(start, end - start, textPane.getStyle(ITALIC), false);
for(int i = start; i < end; i++)
System.out.println(textPane.getStyledDocument().getCharacterElement(i).getAttributes()
.containsAttributes(textPane.getStyle(BOLD))); //all print false
}
private static final String BOLD = "Bold";
private static final String ITALIC = "Italic";
}
这是一个错误,还是我在这里错过了一些东西?
最佳答案
如果我将这一行注释掉:
// textPane.getStyledDocument().setCharacterAttributes(start, end - start, textPane.getStyle(ITALIC), false);
然后,它对所有元素都输出true。根据
setCharacterAttributes
的Javadoc,它使用传入的样式中的所有属性,因此您只需将BOLD
选择替换为ITALIC
选择即可。编辑:
我启动了调试器,并为
getCharacterElement(5)
获取了此属性数组。[0] javax.swing.text.StyleConstants$FontConstants "italic"
[1] java.lang.Boolean "true"
[2] javax.swing.text.StyleConstants "name"
[3] java.lang.String "Italic"
[4] javax.swing.text.StyleConstants$FontConstants "bold"
[5] java.lang.Boolean "true"
如您所见,属性按2组的顺序排列。
italic
设置为true,bold
设置为true,而name
设置为"Italic"
。这可能意味着一个字符的命名属性集仅允许使用一个名称。请注意,未命名的属性已正确合并,因此即使您看不到是否将特定的命名属性应用于字符,这也是您想要的行为。