JTextPane#getText()不返回Components的文本

时间:2012-11-02 10:35:40

标签: java swing

我需要实现一个TextPane,动态地在其中添加内容。它可以有文字和链接。

可以通过将JLabel添加到textPane来显示链接。但问题是,textPane具有的所有文本都需要存储到文件中。 textPane.getText()返回文本,但不附加添加到textPane的任何组件文本。 例如,如果textPane有一个String(“Hello”)和一个JLabel(“label”)。 textPane.getText()仅返回“hello”。如何检索“标签”??

2 个答案:

答案 0 :(得分:1)

通常getText()代表文档的内容。为了您的目标,您应该遍历角色Elements,并为每个角色检查属性是否Component。然后施放到例如JLabel并获取文字等。

同时检查组件如何添加到JTextPane。您可以将组件添加到属性中,并插入包含属性的相应字符串。

SimpleAttributeSet attrs=new SimpleAttributeSet();
StyleConstants.setComponent(...yourLabel);
documnet.insertString(offset, yourLabel.getText(), attrs);

然后,您的Document包含JLabel的文字。

答案 1 :(得分:0)

我的猜测是编写一个递归遍历组件结构的方法,检索每个节点的文本(如果有的话)并附加它。在伪代码中,它看起来像这样:

public void collectText(Container root) {
    StringBuilder builder = new StringBuilder();
    collectText(root, builder);

    return builder.toString();
}

private void collectText(Container root, StringBuilder builder) {
    builder.append(root.getText());

    for (Component c : root.getComponents()) {
        // Check whether this component has other components
        if (c instanceof Container) {
            collectText((Container) c, builder);
        } else {
            // Check whether this Component has text content, and append it to the builder
        }
    }
}

如您所见,它从一个组件开始 - 这将是您的TextPane,然后遍历下面的任何元素。 (可选)您可以在将其文本内容附加到缓冲区之前检查子组件是否实际具有文本。在遍历元素之后,它返回缓冲区的内容。

修改

虽然Container#getComponents() JavaDoc没有说明任何内容,但我假设它总是以相同的顺序返回它的子组件(因为它在内部使用List#toArray()