Java Swing之StyledDocument的合并

http://blog.fyent.net/2011/01/java_swing_merge_styleddocument/


 


     public  void  mergeDocument(DefaultStyledDocument source,
            DefaultStyledDocument dest) 
throws  BadLocationException {
        ArrayList specs 
=  new  ArrayList();
        DefaultStyledDocument.ElementSpec spec 
=  new  DefaultStyledDocument.ElementSpec(
                
new  SimpleAttributeSet(),
                DefaultStyledDocument.ElementSpec.EndTagType);
        specs.add(spec);
        fillSpecs(source.getDefaultRootElement(), specs, 
false );
        spec 
=  new  DefaultStyledDocument.ElementSpec( new  SimpleAttributeSet(),
                DefaultStyledDocument.ElementSpec.StartTagType);
        specs.add(spec);

        DefaultStyledDocument.ElementSpec[] arr 
=  new  DefaultStyledDocument.ElementSpec[specs
                .size()];
        specs.toArray(arr);
        insertSpecs(dest, dest.getLength(), arr);
    }

    
protected  void  insertSpecs(DefaultStyledDocument doc,  int  offset,
            DefaultStyledDocument.ElementSpec[] specs) {
        
try  {
            
//  doc.insert(0, specs); method is protected so we have to
            
//  extend document or use such a hack
            Method m  =  DefaultStyledDocument. class .getDeclaredMethod( " insert " ,
                    
new  Class[] {  int . class ,
                            DefaultStyledDocument.ElementSpec[].
class  });
            m.setAccessible(
true );
            m.invoke(doc, 
new  Object[] { offset, specs });
        } 
catch  (Exception e) {
            e.printStackTrace();
        }
    }

    
protected  void  fillSpecs(Element elem, ArrayList specs,  boolean  includeRoot)
            
throws  BadLocationException {
        DefaultStyledDocument.ElementSpec spec;
        
if  (elem.isLeaf()) {
            String str 
=  elem.getDocument().getText(elem.getStartOffset(),
                    elem.getEndOffset() 
-  elem.getStartOffset());
            spec 
=  new  DefaultStyledDocument.ElementSpec(elem.getAttributes(),
                    DefaultStyledDocument.ElementSpec.ContentType, str
                            .toCharArray(), 
0 , str.length());
            specs.add(spec);
        } 
else  {
            
if  (includeRoot) {
                spec 
=  new  DefaultStyledDocument.ElementSpec(elem
                        .getAttributes(),
                        DefaultStyledDocument.ElementSpec.StartTagType);
                specs.add(spec);
            }
            
for  ( int  i  =  0 ; i  <  elem.getElementCount(); i ++ ) {
                fillSpecs(elem.getElement(i), specs, 
true );
            }

            
if  (includeRoot) {
                spec 
=  new  DefaultStyledDocument.ElementSpec(elem
                        .getAttributes(),
                        DefaultStyledDocument.ElementSpec.EndTagType);
                specs.add(spec);
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值