Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTextPane#getText()不返回组件的文本_Java_Swing - Fatal编程技术网

Java JTextPane#getText()不返回组件的文本

Java JTextPane#getText()不返回组件的文本,java,swing,Java,Swing,我需要实现一个文本窗格,其中的内容将在移动中动态添加。它可以有文本和链接 可以通过将JLabel添加到文本窗格来显示链接。但问题是,textPane的所有文本都需要存储到一个文件中textPane.getText()返回文本,但不会将添加到textPane的组件的任何文本追加到文本窗格中。 例如,如果textPane有一个字符串(“Hello”)和一个JLabel(“label”)textPane.getText()只返回“hello”。如何检索“label”?我的猜测是编写一个递归遍历组件结构

我需要实现一个文本窗格,其中的内容将在移动中动态添加。它可以有文本和链接

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

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

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
,然后遍历下面的任何元素。或者,在将子组件的文本内容附加到缓冲区之前,可以检查子组件是否实际包含文本。遍历元素后,它返回缓冲区的内容

编辑

尽管JavaDoc没有对它做任何说明,但我假设它总是以相同的顺序返回它的子组件(因为它在内部使用
List\toArray()

通常
getText()
表示文档的内容。对于您的目标,您应该迭代字符
元素
,并为每个元素检查属性是否包含
组件
。然后强制转换到例如
JLabel
并获取文本等

还要检查如何将组件添加到
JTextPane
。您可以将组件添加到属性中,并使用属性插入适当的字符串

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

然后,您的
文档
包含
JLabel

的文本。虽然
JTextPane
是一个
容器
,但它并不意味着要向imo添加
组件
。如果您想显示链接,为什么不选择支持HTML并在HTML中创建链接的
JTextComponent
。谢谢。但我不能,因为我在文本窗格中添加了一个功能。向后兼容性html的另一个问题是,内容是动态添加的。我将不得不不断修改html页面,在这里文本窗格有组件。而且文本的顺序需要保持。如何维持订单,谢谢。这正是我添加标签的方式。另一个问题是,;我想从文件(包括JLabels)重新加载textPane。我通过在JLabel中添加的文本周围加上引号来实现这一点。他们的方法能更好吗?序列化??我会添加一个带有一些值的人工属性,例如“MyMarker”。当需要通过文档的getCharacterElement()方法重新加载scn所有字符元素时。然后检查标记值并相应地更新文本。