2017-03-27 7 views
0

私はほとんどこれまでに試したことがあります.JavaのHTMLレンダリングは実際には限られており、HTML 3/2のようにすることもできます。ほとんどすべての最新のCSSスタイルは機能しません。基本的には、縦に並んだ小さなアイコン(10x10px)が複数の行にまたがっている必要があり、実際の解決策を見つけることができません。私が見つけた唯一の回避策は、テーブルを作成することです:JTextPaneはテキストを垂直に整列させ、<img>の画像はhtmlで

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

これは動作しますが、行の折り返しがある場合、1行だけのために、それはもう明らかに動作しません。

ブラウザで正常に動作するその他のソリューションはすべて、JTextPaneでは機能しません。たとえば、div内のテーブルにstyle="float: left;"を設定するか、vertical-align: middle;にimgとdiv要素を設定します。

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メソッドをチェックして、ビュー生成中に何が起こっているかをよりよく理解してください。

幸運

EDIT: より慎重にあなたの質問を読んだ後、私はあなたがfloat属性をレンダリングしたくないことを認識し、ちょうど垂直方向の配置...このためには、setAlignmentYを持っています。ミドルアラインメントの場合は0.5に設定します。 JLabelの場合は、setVerticalAlignmentsetVerticalTextPosition

+0

のsetAlignmentYを使用する必要があります。私はそれを設定するオブジェクトがありません。 –

+0

イメージをどのように挿入しますか? – Sharcoux

+0

どういう意味ですか? 〜

関連する問題