首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jython --如何将两个LeafElements合并到一个DefaultStyledDocument中?

Jython --如何将两个LeafElements合并到一个DefaultStyledDocument中?
EN

Stack Overflow用户
提问于 2016-01-16 09:57:16
回答 1查看 40关注 0票数 0

我正在尝试“规范化”一个DefaultStyledDocument子类,就像我们有org.w3c.dom.Node.normalize():也就是说,合并相邻的文本“叶”。在DefaultStyledDocument的情况下,如果两个相邻的叶子具有相同的属性(或没有属性),则识别这些叶子以进行合并。

下面是一个简单的版本(我们不检查实际的属性:它是用例,您可以使用纯文本,也可以使用一种可能的标记样式)。

代码语言:javascript
复制
def normalise( self ):
    # recursive function:
    def normalise_structure( el, depth = 0 ):
        indent = '  ' * depth
        start = el.startOffset
        print( '%s# el %s |%s|' % ( indent, el, self.getText( start, el.endOffset - start )))
        prev_attr_set = None
        for i in range( el.elementCount ):
            subelement = el.getElement( i )
            normalise_structure( subelement, depth + 1 )
            if subelement.leaf:
                curr_attr_set = subelement.attributes
                print( '%s  # this is a leaf, attribs %s' % ( indent, curr_attr_set, ))
                # this is a simple version: only works if there is only one possible attribute
                if prev_attr_set and curr_attr_set and prev_attr_set.attributeCount == curr_attr_set.attributeCount:
                    print( '%s  # %s leaf needs to be merged with previous leaf' % ( 
                                indent, 'marked-up' if prev_attr_set.attributeCount == 1 else 'plain'))
                    attr_set = prev_attr_set.getElement( 0 ) if prev_attr_set.attributeCount else None
                    prev_subelement = el.getElement( i - 1 )
                    prev_start = prev_subelement.startOffset
                    curr_end = subelement.endOffset
                    merged_element = javax.swing.text.AbstractDocument.LeafElement( 
                        javax.swing.text.DefaultStyledDocument(), el, attr_set, prev_start, curr_end  )
                    el.replace( prev_start, curr_end - prev_start, [ merged_element ] )
                prev_attr_set = curr_attr_set
            else:
                print( '%s  # NOT a leaf...' % ( indent, ))
                prev_attr_set = None
    for self_el in self.rootElements:
        normalise_structure( self_el )

当我运行这个程序时,我会得到以下错误:

线程“AWT 0”中的异常在javax.swing.text.AbstractDocument$BranchElement.replace(AbstractDocument.java:2290)的java.lang.System.arraycopy(本机方法)处

在将javax.swing.text.DefaultStyledDocument()作为LeafElement构造函数中的param 1尝试之前,我赶紧添加这样的内容:"self“(即在第一行调用normalise的DefaultStyledDocument ):相同的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-16 13:13:39

是的,可以:

AbstractDocument.BranchElement.replace()看起来是这样的:

代码语言:javascript
复制
public void replace(int offset, int length, Element[] elems)
  ...

这里的“偏移”和“长度”指的是BranchElement的子元素(通常是LeafElements),而不是StyledDocument中底层文本的偏移量和长度。

比我聪明的人会更早得到这个。API文档(Java 7)可能会使它更加清晰.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34825672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档