IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

JTextPane et background


Sujet :

Composants Java

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut JTextPane et background
    Bonjour,
    J'utilise un JTextPane dans un JScrollPane pour avoir le retour à la ligne automatique et le défilement avec un scrollbar vertical.
    Mon problème est que je voudrai que le fond de mon JtextPane soit d'une certaine couleur. Donc comme pour d'autres composants, je tente ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		JTextPane textPane = new JTextPane();
    		textPane.setOpaque(true);
    		textPane.setBackground(Color.CYAN);
    Mais ma couleur de fond reste désespérément blanche.
    Quelque chose m'aurait-il échappé ?
    C'est en respectant les autres que l'on se fait respecter.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    jTextPane affiche un document riche, avec couleurs de fond etc. Le background est pris de son document, pas de ses propriétés.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Color backgroundColor = Color.CYAN;
        SimpleAttributeSet background = new SimpleAttributeSet();
        StyleConstants.setBackground(background, backgroundColor);
        textPane.getStyledDocument().setParagraphAttributes(0, 
                textPane.getDocument().getLength(), background, false);

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    En effet j'avais seulement vu le background le style applicable au texte mais cela ne colorait que le fond des lettres.

    Voici tout le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    package test;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextPane;
    import javax.swing.ScrollPaneConstants;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.StyleConstants;
    import javax.swing.text.StyledDocument;
     
    public class PanneauDroit extends JScrollPane 
    {
    	public PanneauDroit()
    	{
    		super();
    		setPreferredSize(new Dimension(350,250));
    		setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    		getViewport().setBackground(Color.CYAN);
     
    		//le header
    		JPanel header = new JPanel();
    		header.setBackground(Color.BLUE);
    		header.setPreferredSize(new Dimension(300,200));
    		header.setLayout(new BorderLayout());
    		setColumnHeaderView(header);
     
    		//le coin
    		JPanel coin = new JPanel();
    		coin.setBackground(Color.BLUE);
    		setCorner(JScrollPane.UPPER_RIGHT_CORNER, coin);
     
    		header.setLayout(new BorderLayout());
    		//l'image à gauche
    		ImageIcon image = new ImageIcon("images/h150.png");
    		JLabel label = new JLabel(image);
    		header.add(label, BorderLayout.WEST);
     
    		//le bouton de modification
    		JPanel p1 = new JPanel();
    		p1.setBackground(Color.BLUE);
    		JButton bouton = new JButton("un bouton");
    		p1.add(bouton);
    		header.add(p1, BorderLayout.SOUTH);
     
    		//le texte du header
    		JTextPane textePane = new JTextPane();
    		textePane.setContentType("text/html");
    		String texte = "<html><body bgcolor = 'blue', marginWidth = 5><h1>"
    				+ "Prénoms & NOM</h1>Surnom</body></html>";
    		textePane.setEditable(false);
    		textePane.setText(texte);
    		textePane.setBorder(null);
    		header.add(textePane, BorderLayout.CENTER);
     
    		JTextPane textPane = new JTextPane();
    		SimpleAttributeSet normal = new SimpleAttributeSet();
    		SimpleAttributeSet titre = new SimpleAttributeSet();
    		titre.addAttributes(normal);
    		StyleConstants.setFontSize(titre, 14);
    		StyleConstants.setBold(titre, true);
    		StyleConstants.setForeground(titre, Color.BLUE);
     
    		Color backgroundColor = Color.CYAN;
    	        SimpleAttributeSet background = new SimpleAttributeSet();
    	        StyleConstants.setBackground(background, backgroundColor);
     
    		try
    		{
    			StyledDocument doc = textPane.getStyledDocument();
    			doc.insertString(0, "Un titre\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", normal);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
    			doc.insertString(doc.getLength(), "Une ligne assez longue pour devoir passer à la ligne automatiquement\n", titre);
     
    			doc.setParagraphAttributes(0,doc.getLength(), background, false);
    		}
    		catch (BadLocationException e) 
    		{
    			e.printStackTrace();
    		}
    		setViewportView(textPane);
    	}
    }
    J'ai rajouté le style de paragraphe que tu préconises mais malheureusement cela ne change rien.
    Plus exactement c'est bien le background du paragraphe qui est modifié et non le background du document. Ce que je cherche correspond en Word à la couleur de page, qui n'est pas (et c'est normal) dans les attributs de caractères ou de paragraphes.
    C'est en respectant les autres que l'on se fait respecter.

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par Patrice Henrio Voir le message
    Bonjour,
    J'utilise un JTextPane dans un JScrollPane pour avoir le retour à la ligne automatique et le défilement avec un scrollbar vertical.
    Mon problème est que je voudrai que le fond de mon JtextPane soit d'une certaine couleur. Donc comme pour d'autres composants, je tente ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		JTextPane textPane = new JTextPane();
    		textPane.setOpaque(true);
    		textPane.setBackground(Color.CYAN);
    Mais ma couleur de fond reste désespérément blanche.
    Quelque chose m'aurait-il échappé ?
    En effet quelque chose m'avait échappé :
    Pour setBackground, on trouve dans la définition ces explications. la dernière ligne m'avait échappé.
    /**
    * Sets the background color of this component. The background
    * color is used only if the component is opaque, and only
    * by subclasses of <code>JComponent</code> or
    * <code>ComponentUI</code> implementations. Direct subclasses of
    * <code>JComponent</code> must override
    * <code>paintComponent</code> to honor this property.
    * <p>
    * It is up to the look and feel to honor this property, some may
    * choose to ignore it.

    J'utilise le LookAndFeel Nimbus qui justement ignore setBackground pour les JTextPane. Si je supprime le chargement de ce LookAndFeel, tout marche correctement. Dommage.

    Je vais voir pour faire moi-même ce setBackground dans ce cas, sinon je me passerai de Nimbus.
    C'est en respectant les autres que l'on se fait respecter.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La méthode bourrin serait de mettre le JTextpane dans un component qui a une background color

    Sinon bonne nouvelle, ce bug a déjà été rapporté. Vous ête maintenant donc 2

    https://bugs.openjdk.java.net/browse/JDK-8058704

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    La méthode bourrin serait de mettre le JTextpane dans un component qui a une background color

    Sinon bonne nouvelle, ce bug a déjà été rapporté. Vous ête maintenant donc 2

    https://bugs.openjdk.java.net/browse/JDK-8058704
    Merci de l'info. C'est bon de ne pas se sentir seul ... mais qui est le "vendredi" de l'autre

    J'ai cru comprendre que quelqu'un proposait une solution via le ManagerUI mais j'ai pas trop compris ce qu'il fait. Je crois comprendre que l'on rajoute une méthode backgroundPainter à TextPane, méthode qui doit être invoquée quand on utilise setBackground. J'ai essayé sa méthode et ça n'a rien changé.

    Sinon après avoir cherché pendant deux jours comment passer outre sans ré-écrire un JTextPane personnalisé (encore que j'ai commencé à essayer) je me suis d'abord rabattu sur le LookAndFeel par défaut. Dommage.
    Avec la solution de mettre le JTextPane dans un autre composant (un JPanel par exemple) on perd la gestion automatique du retour à la ligne du JTextPane comme j'ai pu le lire sur plusieurs discussions sur developpez.net et le constater par moi-même.

    Finalement j'utilise un JTextPane avec un ContentType "text/html" ce qui me permet de définir le background du document via le HTM ce qui a exactement le même résultat qu'un setBackground sur le JTextPane et marche même avec Nimbus. Attention, Java ne gère pas nativement le HTML5 ni même le 4 et certaines balises ou commandes sont ignorées, exemple Color = 'red' ne marche pas il faut écrire Color = '#FF0000'. J'utilise les apostrophes pour ne pas être embêté avec les guillemets en Java.
    C'est en respectant les autres que l'on se fait respecter.

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par Patrice Henrio Voir le message
    Finalement j'utilise un JTextPane avec un ContentType "text/html" ce qui me permet de définir le background du document via le HTM ce qui a exactement le même résultat qu'un setBackground sur le JTextPane et marche même avec Nimbus. Attention, Java ne gère pas nativement le HTML5 ni même le 4 et certaines balises ou commandes sont ignorées, exemple Color = 'red' ne marche pas il faut écrire Color = '#FF0000'. J'utilise les apostrophes pour ne pas être embêté avec les guillemets en Java.
    Par conséquent on peut tout aussi bien utiliser un JEditorPane, ce que je fais finalement puisque je n'utilise pas la possibilité d'insérer des composants dans le texte et que les styles utilisés sont reproductibles en HTML.
    Par contre j'ai découvert un truc amusant (les pros se gausseront sans doute).
    Je place un JEditorPane (ou un JTextPane) dans un JPanel. Pour conserver la gestion du retour à la ligne du JEditorPane il faut déclarer une PreferredSize au panneau et un BorderLayout, le JEditorPane doit être placé au centre. Cette gestion du retour à la ligne ne marche bizarrement qu'en mode mot. Si votre mot est composé de plus de caractères qu'il ne peut y en avoir sur la ligne, le retour à la ligne n'est pas automatique.
    C'est en respectant les autres que l'on se fait respecter.

Discussions similaires

  1. comment faire un background transparent?
    Par guigui1005 dans le forum Composants
    Réponses: 5
    Dernier message: 17/05/2012, 21h45
  2. Réponses: 11
    Dernier message: 20/09/2007, 14h51
  3. Réponses: 8
    Dernier message: 09/04/2004, 14h03
  4. [JTextPane] saut de ligne...
    Par neric dans le forum Composants
    Réponses: 2
    Dernier message: 21/01/2004, 15h01
  5. Scroll automatique dans un JTextPane
    Par regbegpower dans le forum Composants
    Réponses: 9
    Dernier message: 11/11/2003, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo