我一直在我编写的应用程序中使用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"。这可能意味着一个字符的命名属性集仅允许使用一个名称。请注意,未命名的属性已正确合并,因此即使您看不到是否将特定的命名属性应用于字符,这也是您想要的行为。

09-27 17:33