2016-09-03 13 views
0

私はJTextPaneを使ってHTMLをレンダリングしています。 HTMLEditorKitStyleSheetを使用して、codeプロパティにルールを追加するので、StackOverflowのコードとまったく同じように見えます。問題は、レンダリングエンジンでであるプロパティの1つとしてpaddingプロパティがリストされているにもかかわらず、がコード(1ピクセルの上端/下端、5ピクセル左/右)にパディングを描画しないことです。 in the documentation。ここでCSSパディングがJTextPaneにレンダリングされない

は、私が(this CSSDeck Labで示すように)見ることを期待するものである: Expected Output
↑ - ↑↑ - ↑
EDIT:
私は<code>タグを使用してから切り替えています私のHTMLは@Sharcouxの提案で<span>に切り替えました。これにより、使用されるコードのフォントサイズが<pre>タグのテキストと同じになり、赤い背景が緑色の境界と同じ高さになりましたが、期待どおりの結果が得られません。興味があればHereは原画像です。 Actual Output

私もテキストではなく、無駄にCSSをインラインで移動しようとしている:

これは、実際に表示されるものです。

MCVE(また編集):

import java.awt.Dimension; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
import javax.swing.text.html.HTMLEditorKit; 
import javax.swing.text.html.StyleSheet; 

public class CodePaddingMCVE { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      JFrame frame = new JFrame("Code Padding Test"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      JTextPane tp = new JTextPane(); 
      tp.setContentType("text/html"); 

      HTMLEditorKit kit = new HTMLEditorKit(); 
      tp.setEditorKit(kit); 
      StyleSheet sheet = kit.getStyleSheet(); 
      sheet.addRule("span {padding: 1px 5px; background-color: red}"); //Using span here 
      sheet.addRule("pre {padding: 0px; background-color: green}"); 
      tp.setDocument(kit.createDefaultDocument()); 
      tp.setText("<html><pre>NotCode<span>Code</span>NotCode</pre></html>"); //Using <span> here too 

      JScrollPane sp = new JScrollPane(tp) { 
       private static final long serialVersionUID = 1L; 

       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(250, 50); 
       } 

      }; 

      frame.getContentPane().add(sp); 
      frame.pack(); 
      frame.setVisible(true); 
     }); 
    } 

} 

私はOS Xヨセミテ10.10.15、EclipseのMars.2 4.5.2、およびJava 8 [1.8.0_66]を使用しています。

+0

コードの代わりにspan要素を使用する必要があります。そして、私はプリタグが認識されているかどうかはわかりませんが、私は覚えていませんし、私の電話で今すぐです。 – Sharcoux

答えて

1

あなたが正しいです、余白と埋め込みはインライン要素に適用されないようです。 3つのオプションがあります。

1)JTextPaneを放棄し、代わりにJavaFX WebViewを使用します。

2)HTMLDocumentを放棄し、別の実装を使用します。

3)HTMLFactoryをHTMLEditorKitで拡張し、InlineViewを拡張しようとします。あなたはこの道を追求したい場合、あなたはパディングやマージンを実装する方法を参照してくださいLabelViewなどとGlyphView内の内側に掘るする必要があります

import java.awt.Dimension; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
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.HTML; 
import javax.swing.text.html.HTMLEditorKit; 
import javax.swing.text.html.InlineView; 
import javax.swing.text.html.StyleSheet; 

public class CodePaddingMCVE { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame("Code Padding Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JTextPane tp = new JTextPane(); 
       tp.setContentType("text/html"); 

       HTMLEditorKit kit = new HTMLEditorKit() { 
        public ViewFactory getViewFactory() { 
         return new HTMLFactory() { 
          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 instanceof HTML.Tag) { 
            HTML.Tag kind = (HTML.Tag) o; 
            if (kind == HTML.Tag.CONTENT) { 
             return new InlineView(elem) { 
              private short left; 
              private short right; 
              private short top; 
              private short bottom; 
              protected void setPropertiesFromAttributes() { 
               AttributeSet attr = getAttributes(); 
               if (attr != null) { 
                top = (short) StyleConstants.getSpaceAbove(attr); 
                left = (short) StyleConstants.getLeftIndent(attr); 
                bottom = (short) StyleConstants.getSpaceBelow(attr); 
                right = (short) StyleConstants.getRightIndent(attr); 
               } 
               super.setPropertiesFromAttributes(); 
              } 
              //TODO : use the top, left, bottom and right properties to draw the margin/padding 
             }; 
            } 
           } 
           return super.create(elem); 
          } 
         }; 
        } 
       }; 
       tp.setEditorKit(kit); 
       StyleSheet sheet = kit.getStyleSheet(); 
       sheet.addRule("span {padding: 5px 5px 5px 5px; background-color: red}"); //Using span here 
       sheet.addRule("pre {padding: 0px; background-color: green}"); 
       tp.setDocument(kit.createDefaultDocument()); 
       tp.setText("<html><pre>NotCode<span>Code</span>NotCode</pre></html>"); //Using <span> here too 

       JScrollPane sp = new JScrollPane(tp) { 
        private static final long serialVersionUID = 1L; 

        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(250, 50); 
        } 

       }; 

       frame.getContentPane().add(sp); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

:それはあなたのその種の何かを与えるだろう。たぶん、他の人がこれを終える手助けをするかも

幸運。

+0

あなたの答えをありがとう!最も簡単なアプローチのように思えたように、私はJavaFXのWebViewを使いました。 – MasterBlaster

関連する問題