0

목표 :
JEditorPane 및 HTMLDocuments 작업 이미지 제거, 즉 <img>..</img> 태그로 정의 된 요소에 반응해야합니다.DocumentEvent에서 변경된 내용 가져 오기

내가 시도한 것 :
지금은 DocumentListeners를 사용하여 문서 변경시 발생하는 DocumentEvents에 반응합니다. 불행히도 DocumentEvents에는 변경된 내용에 대한 정보가 직접 포함되어 있지 않으므로 어떤 요소가 제거되었는지 식별 할 수는 없습니다. 내가 할 수있는 일은 문서의 모든 요소를 ​​반복하고 이벤트 getChange (Element)를 호출하는 것입니다. 이 솔루션은 부분적으로 작동하지만

document.addDocumentListener(new DocumentListener() { 

    @Override 
    public void removeUpdate(DocumentEvent arg0) { 
     ElementIterator iter = new ElementIterator(document); 
     Element element; 
     while ((element=iter.next()) != null) { 
      ElementChange change = arg0.getChange(element); 
      if (change != null) {     
       Element[] children = change.getChildrenRemoved(); 
       for (Element child : children) { 
        Object name = child.getAttributes().getAttribute(StyleConstants.NameAttribute); 
        System.out.println((HTML.Tag)name);      
        } 
       }    
      } 
      notifyContentChanged(); 
     } 
    }); 
} 

내가 다른 솔루션을 정말 감사하겠습니다 (이미지를 삭제할 때 때때로 SYSOUT는 p-implied 대신 img의보고). 아마, 누군가가 문서의 변경과 관련된 String을 얻는 간단한 방법을 알고있을 것입니까?

허용 대답에 따르면 SOLUTION
다음 코드 (이 경우에는 화상을 제거하기위한) 수신기로서 DocumentFilters의 사용을 보여준다.

document.setDocumentFilter(new DocumentFilter() { 
     @Override 
     public void remove(FilterBypass fb, int offset, int length) 
       throws BadLocationException { 
      if (document.getCharacterElement(offset).getName().equals(HTML.Tag.IMG.toString())) { 
       . 
       . 
      } 
      super.remove(fb, offset, length); 
     } 
    }); 

답변

0

DocumentEvent에는 getOffset() 및 getLength() 메소드가 있습니다. 일반적으로 이미지는 나뭇잎이므로 변경 범위에서 htmlDocument.getCharacterElement()를 사용하여 이미지인지 확인합니다.

업데이트 : commetns

에 discusing의 결과로 당신은하는 DocumentFilter는()를 제거하고 (-삭제에-사실 조각에서) 삭제 한 조각을 얻기 위해 수신기로 사용 재정의 추가 할 수 있습니다.

+0

불행히도, 위의 청취자의 컨텍스트에서는 도움이되지 않습니다. HTMLDocument의 기본 구현은 문서에 대한 변경이 수행 된 후에 ** 수신기를 호출합니다. 즉, 내용 문자열'test'에서'e'를 삭제하고 오프셋/길이를 보면'e' 대신's'를 가리 킵니다. – Johnson

+0

그런 다음 remove()를 재정 의하여 DocumentFilter를 추가하고이를 리스너로 사용하여 삭제 된 부분을 가져올 수 있습니다. – StanislavL

+0

최근에 SWT와 많은 관계를 맺고있는 나에게 수치 스러웠다. 기존의 Listener 인터페이스를 사용하는 데 너무 집중하게 된 것 같다. 나는 이미 DocumentFilters를 사용하는 것에 대해 생각해 보았지만이 경로를 따르지 않았다. 사실, 제 경우에는 다소 "단선"입니다. 당신이 당신의 코멘트에 대한 조언을 당신의 대답에 추가하거나 그것으로 새로운 대답을 만들려면 나는 대답을 받아 드리고 싶습니다, 감사합니다. – Johnson