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

Interfaces Graphiques en Java Discussion :

JTextPane, Ecrire du texte, Insérer images, et le tout dans une JScroll


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut JTextPane, Ecrire du texte, Insérer images, et le tout dans une JScroll
    Bonjour, alors voilà,


    j'ai du texte à mettre en forme avec des images à insérer entre certains paragraphes.


    J'ai commencé par utiliser un JTextPane, mais il s'avérait impossible d'insérer une image entre 2 paragraphes, mais seulement à la fin du texte (à la fin du JTextPane).

    J'ai donc décidé d'utiliser plusieurs JTextPane, et de créer séparemment des panels d'images à insérer entre chaque JTextPane.

    J'ai alors créer un JTextPane principal. J'ai fait un BoxLayout sur celui-ci, et je lui ai ajouté tous les JTextPane secondaires ainsi que les panels d'images.

    Ensuite j'ai voulu tout mettre dans une scroll verticale.

    J'obtient alors des erreurs:
    - d'une part les images sont écrasées
    - d'autre part seule une partie de l'ensemble du texte (ensemble des JTextPanes) s'affiche à l'écran, et la scroll est inactive (je ne peux pas descendre plus bas que l'écran).
    regardez ma photo pièce jointe c'est affreux !

    Voici l'ensemble du code de ma Jframe (tout ne concerne pas ce problème):

    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
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
     
    import java.awt.*;
     
     
    public class ViewDossierTor extends JFrame
    {
     
     
     
     
     
    	public ViewDossierTor(Controller controller)
    	{
     
    		this.setTitle("Compte rendu du dossier");
    	  this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);      
    	  	this.setSize(w, h);
     
    		JScrollPane scroll = new JScrollPane(getPanel());
     
    		this.getContentPane().add(scroll);
     
    	}
     
     
     
    	public JTextPane getPanel()
    	{
     
    		JTextPane jTextPane = new JTextPane();
     
    		jTextPane.setLayout(new BoxLayout(jTextPane , BoxLayout.Y_AXIS));
     
    		jTextPane.add(getPanel1());
    		jTextPane.add(frame1.getContentPane());
    		jTextPane.add(getPanel2());
    		jTextPane.add(getPanel3());
    		jTextPane.add(getPanel4());
    		jTextPane.add(getPanel5());
     
    		return jTextPane;
    	}
     
     
     
    	public JTextPane getPanel1 ()
    	{
     
    		JTextPane jTextPane1 = new JTextPane();
        	jTextPane1.setEditable(true);
     
        	//image1 = new Image1();
     
     
        	// définition des styles
        	Style defaut = jTextPane1.getStyle("default");
        	      StyleConstants.setFontSize(defaut, 13);
          		  StyleConstants.setFontFamily(defaut, "TimesRoman");
        	Style style1 = jTextPane1.addStyle("style1", defaut);
        	      StyleConstants.setFontFamily(style1, "TimesRoman");
        	      StyleConstants.setFontSize(style1, 16);
        	      StyleConstants.setBold(style1, true);
            Style style2 = jTextPane1.addStyle("style2", jTextPane1.getLogicalStyle());
    	          StyleConstants.setBold(style2, true);
    	          StyleConstants.setFontSize(style2, 14);
    	    Style style3 = jTextPane1.addStyle("style3", jTextPane1.getLogicalStyle());
                  StyleConstants.setBold(style3, true);
                  StyleConstants.setFontSize(style3, 13);        
     
     
        	      //StyleConstants.setForeground(style1, Color.BLACK);
     
     
        	String s1 = "I- PREAMBULE\n\n";
        	String s2 = "    La société ACSON a été mandatée par Monsieur "+ s_nom + " afin de réaliser l'étude acoustique de sa maison située "+ s_rue +" à "+ s_ville+ " ("+ s_codePostal+ ") .\nCette étude se fait sur plans et à partir du cahier des charges du constructeur. Elle permet de définir les isolements acoustiques des bâtiments d'habitation par rapport à l'arrêté du 30 mai 1996 en vigueur.\nNous proposerons éventuellement les matériaux à mettre en oeuvre en façade afin que les isolements soient respectés d'un point de vue règlementaire.\n\n\n";
     
     
        	StyledDocument sDoc = (StyledDocument)jTextPane1.getDocument();
     
        	//jTextPane1.insertIcon( new ImageIcon("images/norme2.jpg"));
        	//jTextPane1.insertIcon( new ImageIcon("images/norme4.jpg"));
     
     
     
        	try 
        	{
        	      int pos = 0;
        	      sDoc.insertString(pos, s1, style1);pos+=s1.length();
        	      sDoc.insertString(pos, s2, defaut);pos+=s2.length();
        	    	}	       
     
     
         	catch (BadLocationException e) 
        	{ 
         	}
     
    	    return jTextPane1;
        }
     
     
     
    	public class Image1 extends JPanel
    	{ 
    	    String image1; // image de fond
     
    	    public Image1() 
    	    { 
    	         this.image1 = "images/tableau_3.jpg"; // image de fond
    	    }
     
    	    public void paintComponent(Graphics g)
    	    {
    	         g.drawImage(new ImageIcon(Toolkit.getDefaultToolkit().getImage(image1)).getImage(), 0, 0, this.getWidth(), this.getHeight(), null);
    	    }
    	}
     
     
     
     
    	public class Frame1 extends JFrame 
    	{
     
    	   private JPanel ouest = new JPanel();
    	   private JPanel est = new JPanel();
     
    	   public Frame1() 
    	   {
    		  Image1 image1 = new Image1();
    	  	  //ouest.setBackground(Color.BLUE);
    	      //add(ouest, BorderLayout.WEST);
    	      //add(sud, BorderLayout.SOUTH);
    	      add(image1, BorderLayout.CENTER);
     
    	      //add(est, BorderLayout.EAST);
    	      setVisible(true);
    	   }
    	}  
     
     
     
     
     
    	public JTextPane getPanel2 ()
    	{
     
    		JTextPane jTextPane2 = new JTextPane();
        	jTextPane2.setEditable(true);
     
     
        	// définition des styles
        	Style defaut = jTextPane2.getStyle("default");
        	      StyleConstants.setFontSize(defaut, 13);
          		  StyleConstants.setFontFamily(defaut, "TimesRoman");
        	Style style1 = jTextPane2.addStyle("style1", defaut);
        	      StyleConstants.setFontFamily(style1, "TimesRoman");
        	      StyleConstants.setFontSize(style1, 16);
        	      StyleConstants.setBold(style1, true);
            Style style2 = jTextPane2.addStyle("style2", jTextPane2.getLogicalStyle());
    	          StyleConstants.setBold(style2, true);
    	          StyleConstants.setFontSize(style2, 14);
    	    Style style3 = jTextPane2.addStyle("style3", jTextPane2.getLogicalStyle());
                  StyleConstants.setBold(style3, true);
                  StyleConstants.setFontSize(style3, 13);        
     
     
          	String s19 = "    2.2- Isolement contre les bruits des transports terrestres\n\n";
        	String s20 = "La détermination de l'isolement acoustique minimal des bâtiments d'habitation contre les bruits des transports terrestres est définie par l'arrêté du 30 mai 1996.\n\n";
        	String s21 = "        2.2.1- Classement des infrastructures de transports terrestres\n\n";
        	String s22 = "Le classement des infrastructures de transports terrestres et la largeur maximale des secteurs affectés par le bruit de part et d'autre de l'infrastructure, sont définis en fonction des niveaux sonores de référence, dans le tableau suivant:\n\n";
     
        	StyledDocument sDoc = (StyledDocument)jTextPane2.getDocument();
     
        	try 
        	{
        	      int pos = 0;
     
        	      sDoc.insertString(pos, s19, style2);pos+=s19.length();
        	      sDoc.insertString(pos, s20, defaut);pos+=s20.length();
        	      sDoc.insertString(pos, s21, style2);pos+=s21.length();
        	      sDoc.insertString(pos, s22, defaut);pos+=s22.length();
        	}	       
     
     
     	    catch (BadLocationException e) 
    	    { 
     	    }
     
    	    return jTextPane2;
    	}
     
     
     
    }
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il faut que ta classe Image1 redéfinisse la méthode getPreferredSize pour qu'elle renvoie la taille de l'image dessinée dessus.

  3. #3
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    Merci pour l'aide aussi rapide !

    Comme ça?

    J'ai essayé ça ne marche pas, l'image est toujours écrabouillée ..


    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 class Image1 extends JPanel
    	{ 
    	    String image1; // image de fond
     
    	    public Image1() 
    	    { 
    	         this.image1 = "images/tableau_3.jpg"; // image de fond
    	         this.setPreferredSize(getPreferredSize());
    	    }
     
    	    public Dimension getPreferredSize() 
    	    { 
    	    	return new Dimension(800, 250); 
    	    } 
     
     
    	    public void paintComponent(Graphics g)
    	    {
    	         g.drawImage(new ImageIcon(Toolkit.getDefaultToolkit().getImage(image1)).getImage(), 0, 0, this.getWidth(), this.getHeight(), null);
     
    	    }
    	}

  4. #4
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    En fait mon code est correct pour l'image, mais le problème vient d'ailleurs, il vient du JTextPane, ça n'a pas l'air d'être top comme support.

    Au départ je n'en avais qu'un seul de JTextPane qui contenait tout le texte, et la scroll l'a accepté. Mais avec un JTextPane principal et plusieur secondaires contenus dans ce dernier, ça plante.

    Si maintenant à la place du JTextPane principal j'utilise un COntainer, l'image est bien affichée ainsi que l'ensemble des JTextPanes secondaires (tout le texte est affiché, l'image aussi s'intègre bien au centre) MAIS seulement au lieu de n'avoir qu'un seul SCROLL vertical, j'en ai 2, un vertical et un horizontal.

    Je ne veux qu'un seul scroll vertical.

    De plus je n'ai plus le retour à la ligne automatique inhérent au JTextPane

    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
    public ViewDossierTor(Controller controller)
    	{
     
    		this.setTitle("Compte rendu du dossier");
    	    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
    	  	this.setSize(w, h);
     
    		JScrollPane scroll = new JScrollPane(getPanel());
     
    		this.getContentPane().add(scroll);
     
    		s_pièce[0] = "l'entrée";
    		s_correction[0][0]="facelat_facelat";
     
    	}
     
    	/* 
    	public JTextPane getPanel()
    	{
     
    		JTextPane jTextPane = new JTextPane();
     
    		jTextPane.setLayout(new BoxLayout(jTextPane , BoxLayout.Y_AXIS));
     
    		jTextPane.add(getPanel1());
    		jTextPane.add(frame1.getContentPane());
    		jTextPane.add(getPanel2());
    		jTextPane.add(getPanel3());
    		jTextPane.add(getPanel4());
    		jTextPane.add(getPanel5());
     
    		return jTextPane;
    	}
    	*/
    	public Container getPanel()
    	{
     
    		Container jTextPane = new Container();
     
    		jTextPane.setLayout(new BoxLayout(jTextPane , BoxLayout.Y_AXIS));
     
    		jTextPane.add(getPanel1());
    		jTextPane.add(frame1.getContentPane());
    		jTextPane.add(getPanel2());
    		jTextPane.add(getPanel3());
    		jTextPane.add(getPanel4());
    		jTextPane.add(getPanel5());
     
    		return jTextPane;
    	}
    Images attachées Images attachées  

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    La façon dont tu as coté ton ImagePanel n'est de loin pas la meilleure.

    En effet le chargement de l'image ne doit surtout pas être fait dans le paintComponent, mais dans le constructeur.
    De plus la méthode getImage de Toolkit a deux inconvénients majeurs:

    1. Elle est asynchrone et ne permet pas de savoir si l'image est chargée ou non à la fin de l'appel
    2. Elle ne ressort pas d'exception si l'image n'a pu être chargée.

    Donc on préfèrera quelque chose dans ce style

    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
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.io.*;
     
     
    public class ImagePanel extends JPanel implements Serializable {
        private Image image = null;
        private boolean streched = false;
     
        public ImagePanel(Image image) {
            this.image = image;
        }
     
        public ImagePanel() {
     
        }
        public void setImage(Image image){
            this.image = image;
        }
     
        public Image getImage(Image image){
            return image;
        }
     
        public void setStreched( boolean streched ) {
            this.streched = streched;
        }
     
        public boolean isStreched() {
            return streched;
        }
     
        public Dimension getPrefferedSize(Image image){
            if ( image != null ) {
                return new Dimension(image.getWidth(null), image.getHeight(null);
            }
        }            
     
        public void paintComponent(Graphics g) {
            super.paintComponent(g); //paint background
            if (image != null) { //there is a picture: draw it            
                if( streched ) {             
                    g.drawImage(image,0,0, getWidth(), getHeight, null);
                } else {
                    g.drawImage(image, 0, 0, null); //use image size          
                }
            }
        }
    }
    Auquel on fournira en paramètre une Image chargée via la méthode ImageIO.read. (méthode qui s'assure que l'image est bien chargée à la fin de l'appel et qui lance une exception identifiable en cas de problème).

    Ensuite je te conseille de remplacer ton JTextPane Global par un simple JPanel possédant la même couleur de fond.

    Enfin quoi qu'il en soit, ton postulat de base (à savoir que l'on ne peux pas insérer des image on l'on veux dans un JTextPane) est juste incorrect

    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
    import javax.swing.ImageIcon;
    import javax.swing.JTextPane;
    import javax.swing.text.Style;
    import javax.swing.text.StyleConstants;
    import javax.swing.text.StyledDocument;
     
    public class Main {
      public static void main(String[] argv) throws Exception{
        JTextPane textPane = new JTextPane();
        StyledDocument doc = (StyledDocument) textPane.getDocument();
     
        Style style = doc.addStyle("StyleName", null);
        StyleConstants.setIcon(style, new ImageIcon("imagefile"));
     
        doc.insertString(doc.getLength(), "ignored text", style);
      }
    }

  6. #6
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    Merci !!

    Dsl je réponds un peu tard !

    Bon je vais reprendre tout ça grâce à ces bons conseils !

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

Discussions similaires

  1. [WD-2003] Insérer automatiquement un lien hypertexe dans une image
    Par ybezier dans le forum VBA Word
    Réponses: 1
    Dernier message: 29/07/2012, 20h54
  2. Réponses: 3
    Dernier message: 11/06/2012, 05h41
  3. Réponses: 13
    Dernier message: 06/04/2012, 15h57
  4. insérer une image comme objet ole dans une table
    Par Loutron dans le forum Modélisation
    Réponses: 4
    Dernier message: 29/12/2011, 19h11
  5. ecrire un texte a partir d'un point dans richedit
    Par ramanov dans le forum Langage
    Réponses: 10
    Dernier message: 07/04/2010, 13h30

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