Mini traitement de texte

cs_zakuza Messages postés 5 Date d'inscription samedi 8 avril 2006 Statut Membre Dernière intervention 19 juillet 2012 - 17 juil. 2012 à 13:01
cs_zakuza Messages postés 5 Date d'inscription samedi 8 avril 2006 Statut Membre Dernière intervention 19 juillet 2012 - 19 juil. 2012 à 10:49
Bonjour à tous, je cherche à coder un mini traitement de texte( très mini ).
J'utilise un jtextpane et quelques boutons : gras, italic, souligne ( plus tard les couleurs ) afin de modifier le texte qui s'y trouve .En sélectionnant unepartie de texte et en cliquant sur un bouton j'aimerai que le style s'applique sur le texte sélectionné uniquement .

Bon j'ai pas mal bidouillé pour arriver à quelque chose mais c'est loin d'être concluant,c'est ce qui arrive quand on sais pas vraiment ce qu on fait mais bon faut bien tester. Voila comment je procède :

j'ai donc 3 bouton auquel j'ai ajouté un action listener, ce listener est une instance d'une classe interne que j'initialise à chaque fois avec un texte different, gras, souligne ou, italic pour savoir ce que je dois appliquer à mon texte .

Dans ma classe listener je fais les traitement suivant :

1. je récupère les attribut d'un paragraphe ( champ_texte.getParagraphAttributes() )
2. apparemment je dois le convertir en mutableAttributSet sinon ça ne fonctionnais pas ...
3. ensuite je vérifie si l'attribut est gras , italic ou souligne
4. j'appliqu ele style ou le retire si c'est necessaire
5. Pour finir j'applique le style au paragraphe avec setParagraphAttributes .


Voila ce que je suis parvenu à faire, au départ j'aurai voulu sélectionné une partie de texte puis récupérer les attributs caractère par caractère pour les vérifier et les modifier dans une boucle sur la longueur du texte sélectionné.

J'ai essayé avec getCharacterAttributes et setCharactereAttributes mais sans résultat je n'ai pas réussi à récupérer l'attribut d'un caractère spécifique.
cet fonction est pourtant censé me donner l'attribut d'un caractère la ou se trouve le curseur non ?

Voila le code source de mon ptit programme ? j’espère que vous pourrez m'aider car la je patauge un peu dans la purée .


import java.awt.Color;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextPane;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.text.rtf.RTFEditorKit;


public class editeur_texte extends JPanel {

private JButton gras     = new JButton("GRAS"),
italic   = new JButton("ITALIC"),
souligne = new JButton("SOULIGNE");

private Style S_defaut, S_gras, S_italic, S_souligne, S_gras_italic, S_gras_souligne, S_italic_souligne, S_gras_italic_souligne  ;

private JTextPane champ_texte = new JTextPane();

private String champ_selectionne ;

private StyledDocument sDoc ;

private RTFEditorKit rtfEK = new RTFEditorKit(); 

int posDebut ;

public editeur_texte()
{


this.setLayout(null);


this.sDoc = (StyledDocument)champ_texte.getDocument();


champ_texte.setEditorKit(rtfEK); 

S_defaut = sDoc.getStyle("default");

this.gras.setBounds(10, 10, 100, 30);
this.italic.setBounds(115, 10, 100, 30);
this.souligne.setBounds(220, 10, 100, 30);		
this.champ_texte.setBounds(10, 45, 400, 200);

this.champ_texte.setBorder(BorderFactory.createLineBorder(Color.GRAY));

this.add(gras);
this.add(italic);
this.add(souligne);	
this.add(champ_texte);




this.gras.addActionListener(new ListenerUpdateStyle("gras"));
this.italic.addActionListener(new ListenerUpdateStyle("italic"));
this.souligne.addActionListener(new ListenerUpdateStyle("souligne"));		




}



class ListenerUpdateStyle implements ActionListener
{


private String newString ,
   style	;


public ListenerUpdateStyle( String style  )
{
this.style = style ;
}

@Override
public void actionPerformed(ActionEvent arg0) {
Style S_style = S_defaut;
boolean gras, italic, souligne ;


//this.newString = champ_texte.getSelectedText(); 
                        /* je recupere l'attribut du paragraphe et je le change en MutableAttributeSet  */
SimpleAttributeSet test = new SimpleAttributeSet();
test.addAttributes(champ_texte.getParagraphAttributes());

MutableAttributeSet  attr =  test ; 

/* je met à jour mes boolean*/
gras = StyleConstants.isBold(attr);
italic = StyleConstants.isItalic(attr ) ;
souligne = StyleConstants.isUnderline(attr ) ;

System.out.println(gras+" "+italic+" "+souligne);

/* ici j'ajoute ou retire un style selon le bouton sur lequel j'ai cliqué */
if(style.equals("gras"))
{	
if( gras )
StyleConstants.setBold(attr, false);
else
StyleConstants.setBold(attr, true);
}	
if(style.equals("italic"))
{
if(italic)
StyleConstants.setItalic(attr, false);
else
StyleConstants.setItalic(attr, true);
}	
if(style.equals("souligne"))	
{
if(souligne )
StyleConstants.setUnderline(attr, false);
else
StyleConstants.setUnderline(attr, true);
}


//System.out.println(champ_texte.getSelectionStart()+ " à " + champ_texte.getSelectionEnd());
       //sDoc.setParagraphAttributes(champ_texte.getSelectionStart(), champ_texte.getSelectionEnd(), attr, false);
    


champ_texte.setParagraphAttributes(attr, false);
champ_texte.setCharacterAttributes(attr, false);

/*---------------------*/


}

}

}

1 réponse

cs_zakuza Messages postés 5 Date d'inscription samedi 8 avril 2006 Statut Membre Dernière intervention 19 juillet 2012
19 juil. 2012 à 10:49
rebonjour apparemment ça ne parle pas à grand monde, j'ai fini par trouver un moyen en récupérant les attributs des caractères sélectionnés un par un, pour ensuite les modifier et au final les mettre à jour dans le documentStyle .

J'obtiens un rendu similaire à word pour le gras italic et souligne .

J'aimerai bien avoir l'avis de quelqun d'experimenté pour savoir si c'est une bonne méthode si cela intéresse quelqu'un de jeter un coup d'eoil et de me faire un retour critique je mettrai le code .

merci d'avance .
0
Rejoignez-nous