2017-03-27 17 views
0

JTextPane 거의 모든 것을 시도했습니다. 또한 Java의 HTML 렌더링은 HTML 3/2 또는 이와 비슷한 방식으로 수행 할 수 있습니다. 그래서 대부분의 현대 CSS 스타일은 작동하지 않습니다. 기본적으로 몇 줄의 텍스트 위에 세로로 정렬 된 작은 아이콘 (10x10 픽셀)이 필요하며 작동하는 솔루션을 찾을 수 없습니다. 내가 찾은 유일한 해결 방법은 테이블을 만드는 것입니다 : 줄 바꿈이있는 경우, 그것은 더 이상 분명 작동하지 않습니다,하지만 단지 하나의 라인텍스트를 수직으로 정렬하고 <img> 이미지를 html로

<table><tr><td>text</td><td><img></td><td>text</td></tr></table> 

이 작동합니다.

브라우저에서 정상적으로 작동하는 다른 모든 솔루션은 JTextPane에서 작동하지 않습니다. 예를 들어 div의 테이블에 style="float: left;"을 설정하거나 img 및 div 요소와 함께 vertical-align: middle;을 사용합니다.

HTMLEditorKit의 getViewFactory를 조작하여 렌더링해야하는 위치 아래의 모든 픽셀을 반환하는 "더러운"방법이 있습니까?

답변

0

이렇게하면 HTMLFactory를 편집 할 수 있습니다. 여기서 InlineView를 변경하여 대각선으로 파업 할 수있게했습니다. 당신의 목적에 맞게 사용하십시오.

import java.awt.BasicStroke; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.awt.Stroke; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.Element; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.View; 
import javax.swing.text.ViewFactory; 
import javax.swing.text.html.CSS; 
import javax.swing.text.html.HTML; 
import javax.swing.text.html.HTMLEditorKit; 
import javax.swing.text.html.InlineView; 

/** 
* 
* @author François Billioud 
*/ 
public class HTMLBetterEditorKit extends HTMLEditorKit { 

    private final HTMLEditorKit.HTMLFactory factory = new HTMLBetterFactory(); 
    @Override 
    public ViewFactory getViewFactory() { 
     return factory; 
    } 

    public static class HTMLBetterFactory extends HTMLEditorKit.HTMLFactory { 
     @Override 
     public View create(Element elem) { 
      AttributeSet attrs = elem.getAttributes(); 
      Object elementName = attrs.getAttribute(AbstractDocument.ElementNameAttribute); 
      Object o = (elementName != null) ? null : attrs.getAttribute(StyleConstants.NameAttribute); 
      if (o == HTML.Tag.CONTENT) { 
       return new StrikeView(elem); 
      } 
      return super.create(elem); 
     } 

     private class StrikeView extends InlineView { 
      public StrikeView(Element elem) { super(elem); } 

      public void paint(Graphics g, Shape allocation) { 
       setStrikeThrough(false);//We will do that ourselves 
       super.paint(g, allocation); 
       Object textDecorationValue = getAttributes().getAttribute(CSS.Attribute.TEXT_DECORATION); 
       if(textDecorationValue!=null && textDecorationValue.toString().equals("line-through")) { 
        paintStrikeLine(g, allocation); 
       } 
      } 

      //paints the strike line 
      public void paintStrikeLine(Graphics g, Shape a) { 
       int y = a.getBounds().y+a.getBounds().height/2; 
       int x1 = (int) a.getBounds().getX(); 
       int x2 = (int) (a.getBounds().getX() + a.getBounds().getWidth()); 

       Stroke oldStroke = ((Graphics2D)g).getStroke(); 
       ((Graphics2D)g).setStroke(new BasicStroke(2)); 
       g.drawLine(x1, y, x2, y); 
       ((Graphics2D)g).setStroke(oldStroke); 
      } 
     } 
    } 
} 

JTextPane의 EditorKit으로 BetterHTMLEditorKit을 설정하기 만하면됩니다.

이미지가 렌더링되는 방식을 편집하는 방법에 대해 예를 들어 FloatView를 만듭니다. 문제는 부동 이미지 주변에서 단락과 텍스트가 렌더링되는 방식을 편집해야하므로 BlockView 및 InlineView를 다시 정의해야한다는 것입니다. 따라서 쉬운 일이 아닙니다. 그러나 성공하면 공유하는 것을 주저하지 마십시오!

HTMLEditorKit.create 메서드를 확인하여 뷰 생성 중에 발생하는 상황을보다 잘 이해할 수 있습니다.

행운

편집 : 더 신중하게 질문을 읽은 후 , 나는 당신이 float 속성을 렌더링하지 않으려는 것을 깨닫게하지만,이 단지 수직 정렬 ..., 당신은 setAlignmentY 있습니다. 중간 정렬의 경우 0.5로 설정하십시오. JLabel의 경우 setVerticalAlignmentsetVerticalTextPosition

+0

setAlignmentY를 사용해야 할 수도 있습니다. 나는 그것을 설정할 개체가 없습니다. –

+0

어떻게 이미지를 삽입합니까? – Sharcoux

+0

무엇을 의미합니까? ~ 통해 –