2017-03-23 16 views
1

다음과 같은 문제점이 있습니다. 즉, HTMLEditorKit과 함께 JTextPane을 사용하고 동적으로 내용을 창에 추가하고 있습니다. 콘텐츠는 여러 줄에 걸쳐있을 수 있으며 이미지가 많이 포함되어 있습니다 (작은 아이콘). 문제는 지금, 내가 예를 들어를 통해 아이콘과 텍스트의 무리 삽입하는 경우 :HTMLEditorKit를 사용하여 동적 JTextPane을 천천히 구문 분석합니다.

editorKit.insertHTML(doc, doc.getLength(), htmlCode, 0, 0, null); 

을 결과이며, 오랜 시간을내어 HTML 코드의 이미지가 화면에 표시하는 것을 (~ 일초) :

enter image description here

질문 :

imgsrc = "file:/" + imgSRCOnHDD; 
imgsrc = imgsrc.replace("\\", "/"); 
imgSub = "<img height=\"18\" width=\"18\" style=\"vertical-align:middle;\" src='" + imgsrc + "'></img>"; 
내가 pane.insertIcon의 B를 사용하지 못할

:있는 방법은 HTML 코드는 VIA의 경우 창에 표시된 이미지를 버퍼 있나요 HTMLEditor의 ecause. 어떤 종류의 컨테이너를 보이지 않게 설정하고, 내용을 창에 추가 한 다음 컨테이너를 표시하도록 설정 했습니까?

+0

어쩌면'SwingWorker의 '? [프로필] (http://stackoverflow.com/q/2064427/230513). – trashgod

+1

http://java-sl.com/tip_local_images.html 자신의 캐시에 이미지를 입체적으로 만들 수 있습니다 – StanislavL

+0

힌트를 주셔서 대단히 감사드립니다. 문제가 해결되었습니다. –

답변

1

@StanislavL 작성자가 문제를 해결할 수 있도록 해주었습니다. 링크가 제공되지는 않았지만 작동하지 않았고 이유를 찾지 못했습니다. URL이 정확하다는 것을 다시 확인했지만 캐시를 설정 한 후에는 항상 모든 이미지에 대해 "깨진 링크"그림을 보여줍니다. 그래서는 HTMLEditorKit의 캐시 메커니즘의 지식,이 게시물을 발견 :

https://stackoverflow.com/a/27669916/7377320

언급 된 코드 :

public class ImageCache extends Hashtable { 

    public Object get(Object key) { 

     Object result = super.get(key); 

     if (result == null){ 

      result = Toolkit.getDefaultToolkit().createImage((URL) key); 
      put(key, result); 
     } 

     return result; 
    } 
} 

...

Dictionary cache = (Dictionary) pane.getDocument().getProperty("imageCache"); 

if (cache == null) { 

    cache = new ImageCache(); 
    pane.getDocument().putProperty("imageCache", cache); 
} 

, 완벽한 근무 지금 일하고있다. 너무

public class MyImageView extends ImageView { 

    public MyImageView(Element elem) { 
     super(elem); 
    } 

    @Override 
    public Icon getNoImageIcon() { 
     return null; 
    } 

    @Override 
    public Icon getLoadingImageIcon() { 
     return null; 
    } 
} 

이 늘 창에 더 이상 깨진 링크 사진을 보여, 또한 아니오 "사전로드"깨진 링크 사진 : 나는 또한 이것을는 HTMLEditorKit에 대한 이미지 뷰로 변경했다.

는 HTMLEditorKit :

public class MyHTMLEditorKit extends HTMLEditorKit { 

    @Override 
    public ViewFactory getViewFactory() { 

     return new HTMLEditorKit.HTMLFactory() { 

      public View create(Element e) { 

       View v = super.create(e); 

       Object o = e.getAttributes().getAttribute(StyleConstants.NameAttribute); 

       if (o instanceof HTML.Tag) { 

        HTML.Tag kind = (HTML.Tag) o; 

        if (kind == HTML.Tag.IMG) { 
         return new MyImageView(e); 
        } 
       } 

       if (v instanceof InlineView) { 

        return new InlineView(e) { 

         public int getBreakWeight(int axis, float pos, float len) { 
          return View.GoodBreakWeight; 
         } 

         public View breakView(int axis, int p0, float pos, float len) { 

          if (axis == View.X_AXIS) { 

           checkPainter(); 

           int p1 = getGlyphPainter().getBoundedPosition(this, p0, pos, len); 
           if (p0 == getStartOffset() && p1 == getEndOffset()) { 
            return this; 
           } 

           return createFragment(p0, p1); 
          } 

          return this; 
         } 
        }; 
       } else if (v instanceof ParagraphView) { 

        return new ParagraphView(e) { 

         protected javax.swing.SizeRequirements calculateMinorAxisRequirements(int axis, javax.swing.SizeRequirements r) { 

          if (r == null) { 
           r = new javax.swing.SizeRequirements(); 
          } 

          float pref = layoutPool.getPreferredSpan(axis); 
          float min = layoutPool.getMinimumSpan(axis); 

          // Don't include insets, Box.getXXXSpan will include them. 
          r.minimum = (int) min; 
          r.preferred = Math.max(r.minimum, (int) pref); 
          r.maximum = Integer.MAX_VALUE; 
          r.alignment = 0.5f; 

          return r; 
         } 

        }; 
       } 

       return v; 
      } 
     }; 
    } 
}