从AttributedString获取文本(纯字符串)-如何做到,为什么这么难?

3
我可以这样创建一个AttributedString对象:
AttributedString as = new AttributedString("Hello world"); 

直截了当的问题 - 如何从 AttributedString 对象中获取基础文本 ("Hello world")? as.toString() 会产生字符串 "java.text.AttributedString@65f00565"。
我在 AttributedString.class 中看到这些信息被存储,但是故意标记为私有 --

除长度外,所有读取操作都是私有的, 因为通过迭代器访问 AttributedString 实例

看起来我需要使用 as.getIterator() 获取一个 AttributedCharacterIterator 并对其进行迭代以生成底层字符串吗? 这是最佳方法吗? 为什么这些信息如此难以获取?

那就直接传递字符串,然后在方法内部创建AttributedString,是这样吗? - bwa-
2
@StuBlair,除非你能在方法中从String构建AttributedString,否则除了你列出的两个选项之外,没有其他选择:获取迭代器或提前请求字符串。这两种方法都相当糟糕,但是AttributedString确实是一个非常糟糕的类。 - biziclop
@bwa,AttributedString 包含了重要的格式信息,这些信息是在方法范围之外确定的。 - Stu Blair
@bwa 我想属性已经被设置了,所以仅从字符串构建可能不是一个选项。 - biziclop
1
@StuBlair 这里有一个可以避免一些不友好现象的方法:你可以创建一个包装 AttributedString 和原始字符串的类。你在这个组合上设置所有属性(它将调用封装的 AttributedString),然后传递这个组合而不是底层的恐怖字符串。 - biziclop
显示剩余5条评论
2个回答

4

好的,以下是实现您所要求功能的代码:

    AttributedString s = new AttributedString("Hello");
    AttributedCharacterIterator x = s.getIterator();
    String a = "";

    a+=x.current();
    while (x.getIndex() < x.getEndIndex())
        a += x.next();
    a=a.substring(0,a.length()-1);

    System.out.println(a);

关于适当性的问题,我参考了AttributedString的文档,特别是getIterator()方法:

创建一个AttributedCharacterIterator实例,以便访问此字符串的整个内容。

似乎没有其他方法可以访问实际的String内容。


一个不幸的现实,但你确实回答了这个问题,所以谢谢! - Stu Blair

0
public static String getString(AttributedString attributedString){
        AttributedCharacterIterator it = attributedString.getIterator();
        StringBuilder stringBuilder = new StringBuilder();

        char ch = it.current();
        while( ch != CharacterIterator.DONE)
        {
            stringBuilder.append( ch);
            ch = it.next();
        }
        return stringBuilder.toString();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接