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 :

Ajouter image avec du texte dans JTextPane


Sujet :

Composants Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2013
    Messages : 49
    Points : 39
    Points
    39
    Par défaut Ajouter image avec du texte dans JTextPane
    Bonjour a tous.

    J'ai crée une classe pour mon application qui définit les états d'un JTextPane selon des résultats de recherche.

    Mais je voudrais ajouter une petite image a coté du texte.

    Voici mon 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
    package dr.fidei.componentes;
     
    import java.awt.Color;
     
    import javax.swing.JTextPane;
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.StyleConstants;
    import javax.swing.text.StyledDocument;
    import dr.fidei.componentes.EstadoInfoPanel;
     
    /**
     * <b>InfoPanel es la clase que define un panel de información para mostrar resultados de búsqueda</b>
     * 
     * @author A. Cedano
     * @version 1.0
     * @date 30-12-2013
     */
    public class InfoPanel extends JTextPane {
     
    	private static final long serialVersionUID = -2442636898173029903L;
     
    	/**
             * @param texto
             * @param estado
             */
    	public InfoPanel(String texto, EstadoInfoPanel estado) {
    		setEditable(false);
    		setEtat(estado);
    		setText(texto);
    		StyledDocument doc = this.getStyledDocument();
     
     
    		SimpleAttributeSet center = new SimpleAttributeSet();
    		StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
    		doc.setParagraphAttributes(0, doc.getLength(), center, false);
    	}
     
    	public void setEtat(EstadoInfoPanel estado){
    		switch (estado) {
    		case NEUTRO:
    			setOpaque(false);
    			break;
    		case ERROR:
    			setOpaque(true);
    			setBackground(new Color(232, 117, 140));
    //J'essaie avec "insertIcon" sans success
    //		    insertIcon(new ImageIcon(InfoPanel.class.getResource("/dr/fidei/iconos/find32x32.png")));
     
    			break;
    		case VALIDO:
    			setOpaque(true);
    			setBackground(new Color(168, 220, 120));
    			break;
    		case SINDATOS:
    			setOpaque(true);
    			setBackground(new Color(255, 215, 0));
    			break;
    		}
    	}
     
    }
    Je vous remercie si vous pouvez mes donner des idées.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si tu veux inclure des images dans du texte dans un JTextPane, tu peux procéder comme dans cet exemple :

    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
    public class DemoImageInTextPane {
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		frame.getContentPane().setLayout(new BorderLayout());
     
    		final JTextPane textpane = new JTextPane();
     
    		populateTextPane(textpane);
     
    		frame.getContentPane().add(textpane);
     
    		frame.setSize(200,200);
    		frame.setLocationRelativeTo(null);
     
     
     
    		frame.setVisible(true);
    	}
     
    	private static void populateTextPane(JTextPane textpane) {
    		try {
                StyledDocument document = (StyledDocument)textpane.getDocument();
                //Style textStyle = document.addStyle("TextStyle", null);
                document.insertString(document.getLength(), "Du texte ", null); // texte normal dans le style de base
                Style imageStyle = document.addStyle("ImageStyle", null);
                StyleConstants.setIcon(imageStyle, new ImageIcon("note.png")); // exemple de path d'image
                document.insertString(document.getLength(), "\uFFFC", imageStyle);  // insertion de l'image dans le texte, ici j'utilise un caractère de remplacement qui est \uFFFC, mais tu peux utiliser n'importe quelle chaîne, si tu as besoin de reconnaître l'image dans le texte (par exemple [IMG=note.png]) )
                document.insertString(document.getLength(), " encore du texte", null); // texte normal dans le style de base
     
            } catch (BadLocationException e){
                e.printStackTrace();
            }
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2013
    Messages : 49
    Points : 39
    Points
    39
    Par défaut
    Salut Joel, merci pour ta réponse et bonne année 2014!

    Cela marche en effet, mais je n'arrive pas a mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     StyleConstants.setIcon(imageStyle, new ImageIcon("note.png"));
    dans une méthode comme:
    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
    	public void setEtat(EstadoInfoPanel estado){
    		switch (estado) {
    		case NEUTRO:
    			setOpaque(false);
    			break;
    //ici pas d'image
     
    		case ERROR:
    			setOpaque(true);
    			setBackground(new Color(232, 117, 140));
    //Ici image d'erreur 
    			break;
    		case VALIDO:
    			setOpaque(true);
    			setBackground(new Color(168, 220, 120));
    //Ici image pour un résultat trouvé
    			break;
    		case SINDATOS:
    			setOpaque(true);
    			setBackground(new Color(255, 215, 0));
    //Ici image pour aucun résultat trouvé
    			break;
    		}
    	}
    L'idée est d'appeler la méthode setEtat depuis plusieurs formulaires de recherche pour afficher du texte avec une image, selon le cas.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut, et Bonne Année également.

    Est-ce que tu n'aurais pas plutôt besoin d'un JLabel pour faire ce que tu veux faire ? Ce composant permet d'afficher une image et un texte à coté. Sinon pour le JTextPane, soit tu recrées le texte complet à chaque fois, soit il faut que tu mémorises la position du caractère où est placée l'image et que tu remplaces le style de ce caractère à chaque changement d'état.

    Voici une démo-exemple pour une solution avec JLabel et une solution avec remplacement du texte complet.

    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
    public class DemoImageInTextPane {
     
    	private final static String IMAGE1 = "C:\\Temp\\image1.png";
    	private final static String IMAGE2 = "C:\\Temp\\image2.png";
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		frame.getContentPane().setLayout(new BorderLayout());
     
    		JPanel mainPanel = new JPanel();
    		mainPanel.setLayout(new BorderLayout());
     
    		JPanel panel = new JPanel();
    		panel.setLayout(new GridLayout(0, 1));
     
    		final JTextPane textpane = new JTextPane();
    		populateTextPane(textpane,IMAGE1);
    		panel.add(textpane);
     
    		final JLabel label = new JLabel("Texte", new ImageIcon(IMAGE1), JLabel.LEFT);
    		panel.add(label);
     
    		mainPanel.add(panel, BorderLayout.CENTER);
     
    		JPanel buttonPanel = new JPanel();
    		buttonPanel.setLayout(new GridLayout(1, 2));
    		mainPanel.add(buttonPanel, BorderLayout.SOUTH);
     
     
    		JButton button1 = new JButton("JTextPane");
    		buttonPanel.add(button1);
    		button1.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				populateTextPane(textpane, IMAGE2);
    			}
    		});
    		JButton button2 = new JButton("JLabel");
    		buttonPanel.add(button2);
    		button2.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				label.setIcon(new ImageIcon(IMAGE2));
    			}
    		});
     
    		frame.getContentPane().add(mainPanel);
     
    		frame.setSize(200,200);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static void populateTextPane(JTextPane textpane, String imagePath) {
    		try {
                StyledDocument document = (StyledDocument)textpane.getDocument();
                document.remove(0, document.getLength()); // effacetr le texte précédent
                document.insertString(document.getLength(), "Du texte ", null);
                Style imageStyle = document.addStyle("ImageStyle", null);
                StyleConstants.setIcon(imageStyle, new ImageIcon(imagePath)); 
                document.insertString(document.getLength(), "\ufffc", imageStyle);
                document.insertString(document.getLength(), " encore du texte", null);
     
            } catch (BadLocationException e){
                e.printStackTrace();
            }
    	}
     
    }
    Dans ton cas de code, ça pourrait être simplement comme ça (avec jlabel) :

    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
    	public void setEtat(EstadoInfoPanel estado){
                    String imagePath=null;
    		switch (estado) {
    		case NEUTRO:
    			setOpaque(false);
    			break;
                           //ici pas d'image
    		case ERROR:
    			setOpaque(true);
    			setBackground(new Color(232, 117, 140));
                            //Ici image d'erreur 
                           imagePath="...";
    			break;
    		case VALIDO:
    			setOpaque(true);
    			setBackground(new Color(168, 220, 120));
                        //Ici image pour un résultat trouvé
                           imagePath="...";
    			break;
    		case SINDATOS:
    			setOpaque(true);
    			setBackground(new Color(255, 215, 0));
                            //Ici image pour aucun résultat trouvé
                           imagePath="...";
    			break;
    		}
                    if ( imagePath==null ) {
                          jlabel.setIcon(null); // supprimer l'image
                    }
                    else  {
                          jlabel.setIcon(new ImageIcon(imagePath); // supprimer l'image                      
                      }
    	}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2013
    Messages : 49
    Points : 39
    Points
    39
    Par défaut
    Salut Joel,

    En effet, le mieux c'était un JLabel, je ne sais pour quoi je me cassait la tête avec de JTextPane…

    Ma classe est restée ainsi:

    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
    package dr.fidei.componentes;
     
     
    import java.awt.Color;
     
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JTextArea;
    import javax.swing.JTextPane;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.Style;
    import javax.swing.text.StyleConstants;
    import javax.swing.text.StyledDocument;
     
    import dr.fidei.componentes.EstadoInfoPanel;
     
    /**
     * <b>InfoPanel es la clase que define un panel de información para mostrar resultados de búsqueda</b>
     * 
     * @author A. Cedano
     * @version 1.0
     * @since 2013-12-30
     */
    public class Information {
     
    	private static final long serialVersionUID = -2442636898173029903L;
     
    	/**
             * @param texte
             * @param etat
             * @param lblInfo 
             */
    // Information(EstadoInfoPanel etat, JLabel lblInfo) {
    //		setEditable(false);		
    //	}
     
    	public  JLabel setEtat(EstadoInfoPanel etat, JLabel lblInfo, String mensaje) {
    		switch (etat) {
    		case NEUTRO:
    			lblInfo.setOpaque(false);
    			break;
    		case ERROR:
    			lblInfo.setOpaque(true);
    			lblInfo.setBackground(new Color(232, 117, 140));
    		    lblInfo.setIcon(new ImageIcon(this.getClass().getResource("/dr/fidei/iconos/32x32/error.png")));
    			break;
    		case VALIDO:
    			lblInfo.setOpaque(true);
    			lblInfo.setBackground(new Color(168, 220, 120));
    		    lblInfo.setIcon(new ImageIcon(this.getClass().getResource("/dr/fidei/iconos/32x32/ok_round.png")));
    			break;
    		case SINDATOS:
    			lblInfo.setOpaque(true);
    			lblInfo.setBackground(new Color(255, 215, 0));
    		    lblInfo.setIcon(new ImageIcon(this.getClass().getResource("/dr/fidei/iconos/32x32/warning.png")));
    			break;
    		}
    			lblInfo.setText(mensaje);
    			return lblInfo;
    	}
    }
    La classe n'a même pas de constructeur, mais bon, ce n'est pas interdit…

    Puis, dans une autre classe je construit mon JLabel comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		info = new Information();
    Et je change son état, comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			strMensaje="¡ERROR! Todos los campos de búsqueda están en blanco. Por favor introduzca datos... ";
    			info.setEtat(EstadoInfoPanel.ERROR, lblInfo,strMensaje);
    Merci pour ton aide, le problème est résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [GD] Modifier la taille de police dans une image avec un texte
    Par momosan77 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 31/12/2010, 09h47
  2. Réponses: 1
    Dernier message: 19/02/2010, 20h40
  3. inserer une image et du texte dans une Jlist
    Par cellestion dans le forum Composants
    Réponses: 4
    Dernier message: 03/03/2006, 23h47
  4. Centrer une image et un texte dans un div
    Par flexx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 17/01/2006, 20h11
  5. Centrer des images et du texte dans un tableau
    Par hstlaurent dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 30/08/2005, 16h34

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