2010-04-15 20 views
1

Je ne peux pas regrouper les lignes dans un Java JTextPane si je définis le type de contenu sur text/html. Je les voudrais aussi rapprochés qu'ils le sont quand le type de contenu est text/plain, la valeur par défaut.Impossible de supprimer l'interligne supplémentaire dans JTextPane pour le contenu html

Le line-height, top-margin ... propriétés CSS ne semblent pas aider :(.

C'est la sortie de mon programme d'échantillonnage, qui montre que les lignes prennent plus d'espace quand un manche de l'éditeur HTML le rendu:

alt text http://lh6.ggpht.com/_Wx4sMDdKKdU/S8cYWIPKhzI/AAAAAAAAAig/4QzFwygmEBs/simpleTextPane.PNG

le code qui génère la trame est la suivante:

import java.awt.BorderLayout; 
import java.awt.Dimension; 

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

public class DemoSimplestGui extends JFrame { 
    private static final long serialVersionUID = 1L; 

    private static final int WINDOW_WIDTH = 800; 
    private static final int WINDOW_HEIGHT = 130; 

    private static final String PLAIN_TEXT = "" + 
     "This is some <b>plain text</b>\n" + 
     "separated by backslash-n characters\n" + 
     "There's no empty space between lines\n" + 
     "which is exactly what we need."; 

    private static final String DIV_BASED_HTML_TEXT = "" + 
     "<div>This is some <b>html text</b></div>" + 
     "<div>that usses DIV tags.</div>" + 
     "<div>There's too much blank space</div>" + 
     "<div>and that sucks for my application</div>"; 

    private static final String PRE_BASED_HTML_TEXT = "" + 
     "<pre>This is some <b>html text</b></pre>" + 
     "<pre>that usses PRE tags</pre>" + 
     "<pre>There's too much blank space grr</pre>" + 
     "<pre>and that sucks for my application</pre>"; 

    public static void main(String[] args) { 
     final DemoSimplestGui frame = new DemoSimplestGui(); 
     frame.setPreferredSize(new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT)); 
     frame.setSize(frame.getPreferredSize()); 
     frame.setMinimumSize(new Dimension(WINDOW_WIDTH/2, WINDOW_HEIGHT/2)); 
     frame.init(); 
     frame.setVisible(true); 
    } 

    public void init() { 
     setLayout(new BorderLayout(10, 10)); 
     add(createPlainTextPane(), BorderLayout.WEST); 
     add(createDivBasedHtmlTextPane(), BorderLayout.CENTER); 
     add(createPreBasedHtmlTextPane(), BorderLayout.EAST); 
    } 

    private JTextPane createPlainTextPane() { 
     final JTextPane textPane = new JTextPane(); 
     textPane.setContentType("text/plain"); 
     StyleConstants.setFontFamily(textPane.getInputAttributes(), "Courier New"); 
     textPane.setText(PLAIN_TEXT); 
     return textPane; 
    } 

    private JTextPane createDivBasedHtmlTextPane() { 
     final JTextPane textPane = new JTextPane(); 
     textPane.setContentType("text/html"); 
     textPane.setEditorKit(configureHtmlEditorKit(textPane)); 
     textPane.setText(DIV_BASED_HTML_TEXT); 
     return textPane; 
    } 

    private JTextPane createPreBasedHtmlTextPane() { 
     final JTextPane textPane = new JTextPane(); 
     textPane.setContentType("text/html"); 
     textPane.setEditorKit(configureHtmlEditorKit(textPane)); 
     textPane.setText(PRE_BASED_HTML_TEXT); 
     return textPane; 
    } 

    private HTMLEditorKit configureHtmlEditorKit(JTextPane textPane) { 
     final HTMLEditorKit kit = (HTMLEditorKit) textPane.getEditorKit(); 
     final StyleSheet css = new StyleSheet(); 
     css.addRule("body { font-family: monospaced; margin-top: 0; margin-down: 0; line-height: 0; }"); 
     css.addRule("div, pre { margin-top: 0; margin-down: 0; line-height: 0; }"); 
     kit.setStyleSheet(css); 
     return kit; 
    } 

} 

J'apprécierions vraiment une astuce: D

+0

Toujours essayer de prévisualiser vos sites dans un navigateur, car la plupart des vues de conception de l'éditeur HTML ne sont pas bonnes à rendre ce dont vous avez besoin. – Kyle

+1

Ceci n'est en fait pas un aperçu, le résultat final de ce travail va être rendu dans un JTextPane. Ce serait un bon conseil autrement. – espinchi

Répondre

1

Ce peut être dépendant de la plateforme:

DemoSimplestGui http://i39.tinypic.com/2d0hu1t.png

+0

Ouch, merci pour l'info, en quelque sorte je n'ai pas envisagé d'essayer dans d'autres systèmes d'exploitation! – espinchi

+0

Même sur le même système d'exploitation, 'UIManager.setLookAndFeel()' produit une variété de résultats. 'Metal' semble le plus homogène. Je sympathise avec le "grr". :-) – trashgod

0

Essayez quelque chose comme ça

StyledDocument doc= textPane.getStyledDocument(); 
MutableAttributeSet attr= new SimpleAttributeSet(); 
StyleConstants.setLineSpacing(attr, -0.2f); //NOTE: negative value. 

On dirait que vous utilisez Windows. Quelle version de JDK/JRE est utilisée?

+0

Cette propriété est ignorée, même si je mets 200 comme interligne, ils restent les mêmes. Utilisation de JDK 1.6.0_13 sous Windows – espinchi

0

Résolu! Si j'utilise Courier New au lieu de monospace pour le font-family, l'interligne est exactement le même que dans la text-plain version sous Windows. Merci tout le monde!

+0

'monospace' n'est pas natif de Windows, mais je ne savais pas qu'ils affectent l'espacement des lignes trop ... Assez étrange. – FaithReaper