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 :

Saut de ligne perdu avec JEditorPane


Sujet :

Composants Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut Saut de ligne perdu avec JEditorPane
    Bonjour,

    Ci-dessous vous pourrez trouver un petit exemple pour concrétiser mon propos.
    Lorsque le texte est affiché et que je place le curseur devant l'expression "La suite...." et que je clique pour forcer un saut de ligne, si je relis le texte et que je ré-affiche, l'affichage revient comme au début.

    Dans la réalité, le texte sera sauvegardé dans une base de données pour être ré-affiché, mais je ne veux pas perdre la mise en forme.

    Je subodore qu'il y a une solution simple, mais je ne vois pas comment faire (y-a-t-il une option particulière ?).

    Merci pour votre aide

    Gégé


    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
     
    package test;
     
    import javax.swing.JEditorPane;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
     
    public class MonTexte extends JFrame
    {
    		private static final long serialVersionUID = 1L;
     
    		String original  =  "Un agneau se désaltérait dans le courant d'une onde pure mais un méchant loup attendait sa proie qui ne se doutait pas tout de suite qu'il était surveillé. La suite de cette histoire est bien connue... ";
     
    		public MonTexte() 
    		{
    			initialize();
    		}
     
    		private void initialize() 
    		{
    			this.setBounds(100, 100, 450, 300);
    			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    			this.getContentPane().setLayout(null);
     
    			JEditorPane Memo = new JEditorPane();
    		       Memo.setContentType("text/html");
     
        			JScrollPane scrollPane = new JScrollPane(Memo);
    			 scrollPane.setBounds(41, 11, 351, 193);
    			getContentPane().add(scrollPane);
    			Memo.setText(original);
     
    			JButton Test = new JButton("Tester");
    			Test.addActionListener(new ActionListener() 
    			{
    				public void actionPerformed(ActionEvent e) 
    				{
    					String wk = Memo.getText() ;
    					 Memo.setText(wk) ;
    				}
    			});
    			Test.setBounds(286, 215, 89, 23);
    			getContentPane().add(Test);;
     
    		   this.setLocationRelativeTo(null);
    	        setVisible(true);
    		}
     
    		public static void main(String[] args)  {new MonTexte();}
    }

  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,

    Le souci c'est que le HtmlEditorKit modifie tout ce qu'il faut sauf les key bindings et actions associées. Ce sont celles d'un DefaultEditorKit (y'a bien quelques actions supplémentaire pour gérer des UL/OL/Li ou table). Du coup, quand tu appuies sur la touche entrée, c'est un \n qui est inséré dans le texte, et que l'éditeur rend très bien comme ça (par le HtmlEditorKit hérite du DefaultEditorKit). Et un \n en html, c'est comme si ça existait pas, donc quand tu réinsères le texte, c'est simplement ignoré.

    il faut modifier le HtmlEditorKit pour gérer ça (et tout le reste en théorie : par exemple, tu peux essayer de taper une série d'espaces successives et tu verras que tu les perds aussi).

    Voici un poc fait un rapidement sur base de ton ECM :
    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
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.IOException;
     
    import javax.swing.Action;
    import javax.swing.JButton;
    import javax.swing.JEditorPane;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.KeyStroke;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.Element;
    import javax.swing.text.JTextComponent;
    import javax.swing.text.TextAction;
    import javax.swing.text.html.HTML;
    import javax.swing.text.html.HTMLDocument;
    import javax.swing.text.html.HTMLEditorKit;
     
    public class MonTexte extends JFrame {
    	private static final long serialVersionUID = 1L;
     
    	String original = "Un agneau se désaltérait dans le courant d'une onde pure mais un méchant loup attendait sa proie qui ne se doutait pas tout de suite qu'il était surveillé. La suite de cette histoire est bien connue...";
     
    	public MonTexte() {
    		initialize();
    	}
     
    	private void initialize() {
    		this.setBounds(100, 100, 450, 300);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.getContentPane().setLayout(null);
     
    		JEditorPane Memo = new JEditorPane();
    		Memo.setContentType("text/html");
     
    		JScrollPane scrollPane = new JScrollPane(Memo);
    		scrollPane.setBounds(41, 11, 351, 193);
    		getContentPane().add(scrollPane);
     
    		Memo.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), HTMLEditorKit.defaultKeyTypedAction);
    		Memo.getActionMap().put(HTMLEditorKit.defaultKeyTypedAction,
     
    				new TextAction(HTMLEditorKit.defaultKeyTypedAction) {
     
    					Action defaultAction = new HTMLEditorKit.DefaultKeyTypedAction();
     
    					@Override
    					public void actionPerformed(ActionEvent e) {
     
    						if ( e.getActionCommand().equals("\n") ) {
    							JTextComponent target = getTextComponent(e);
    							if ((target != null) && (e != null)) {
    								if ((!target.isEditable()) || (!target.isEnabled())) {
    									return;
    								}
    								target.replaceSelection("");
    								HTMLDocument htmldoc = ((HTMLDocument) target.getDocument());
     
    								Element elem = htmldoc.getCharacterElement(target.getCaretPosition());
    								if ( target.getCaretPosition()==elem.getEndOffset() ) {
    									try {
    										htmldoc.insertAfterEnd(elem, "<br>");
    									} catch (BadLocationException | IOException e1) {
    										e1.printStackTrace();
    									}
    								}
    								else if ( target.getCaretPosition()==elem.getStartOffset() ) {
    									try {
    										htmldoc.insertBeforeStart(elem, "<br>");
    									} catch (BadLocationException | IOException e1) {
    										e1.printStackTrace();
    									}
    								}
    								else {
     
    									HTMLEditorKit kit = (HTMLEditorKit)((JEditorPane)target).getEditorKit();
     
    					                try {
    										kit.insertHTML( htmldoc,
    										                target.getCaretPosition(),
    										                "<br>",
    										                0,
    										                0,
    										                HTML.Tag.BR);
    									} catch (BadLocationException | IOException e1) {
    										e1.printStackTrace();
    									}
    								}
    								Element newelem = htmldoc.getCharacterElement(target.getCaretPosition());
    								target.setCaretPosition(newelem.getStartOffset());
     
    							}
    						}
    						else {
    							defaultAction.actionPerformed(e);
    						}
     
     
     
    					}
    				}
     
    		);
     
    		Memo.setText(original);
     
    		JButton Test = new JButton("Tester");
    		Test.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				String wk = Memo.getText();
    				System.out.println(wk);
    				Memo.setText(wk);
    			}
    		});
    		Test.setBounds(286, 215, 89, 23);
    		getContentPane().add(Test);
    		;
     
    		this.setLocationRelativeTo(null);
    		setVisible(true);
    	}
     
    	public static void main(String[] args) {
    		new MonTexte();
    	}
    }
    Tu verras qu'il y a un bug pour la dernière ligne (le curseur n’apparaît pas sur une ligne "vide"). Il faudrait modifier la ViewFactory pour régler ça et ça fait aussi partie des choses à faire pour rendre l'HtmlEditorKit plus fonctionnel.
    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
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Un grand merci à toi pour cette réponse. Cet exemple est exactement ce que je cherchais.

    Bonne journée

    Gégé

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

Discussions similaires

  1. saut de ligne CSV avec open O. calc
    Par maximus30 dans le forum Langage
    Réponses: 1
    Dernier message: 24/09/2011, 10h07
  2. le caractere de saut de ligne avec SetDlgItemText
    Par matthieup dans le forum Windows
    Réponses: 4
    Dernier message: 07/11/2004, 18h31
  3. Variable avec saut de ligne à l'intérieur
    Par MaTHieU_ dans le forum Langage
    Réponses: 2
    Dernier message: 09/08/2004, 22h39
  4. problème avec le caractère saut de ligne ...
    Par vbcasimir dans le forum Administration
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

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