2016-09-03 106 views
0

我正在使用JTextPane來渲染某些HTML。我正在使用HTMLEditorKitStyleSheet將規則添加到code屬性,因此它看起來與StackOverflow上的代碼非常相似。問題在於JTextPane不會在代碼上呈現填充(1像素頂部/底部,5像素左/右),即使padding屬性被列爲支持的屬性之一in the documentation未在JTextPane中渲染的CSS填充

這是我希望看到(如圖this CSSDeck Lab): Expected Output
↑ - ↑↑ - ↑
編輯:
我已經使用在<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約塞米蒂15年10月10日時,Eclipse Mars.2 4.5.2和Java 8 [1.8.0_66]。

+0

您應該使用span元素而不是代碼。而且我不確定預標籤是否被識別,但我不記得,現在正在使用我的手機。 – Sharcoux

回答

1

你是對的,邊距和填充似乎不適用於內聯元素。你有3個選項。

1)放棄JTextPane並改用JavaFX WebView。

2)放棄HTMLDocument並使用另一個實現。

3)嘗試在HTMLEditorKit中擴展HTMLFactory,並擴展InlineView。它會給你這一類東西:

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); 
      } 
     }); 
    } 
} 

如果你希望走這條道路,你將需要LABELVIEW和GlyphView裏面挖,看看如何實現填充或保證金。也許別人可以幫助完成這一點。

祝你好運。

+0

感謝您的回答!我使用了JavaFX的'WebView',因爲它似乎是最簡單的方法。 – MasterBlaster