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

AWT/Swing Java Discussion :

mis à jour JTextPane pour Wrap/noWrap


Sujet :

AWT/Swing Java

  1. #1
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut mis à jour JTextPane pour Wrap/noWrap
    Bonjour,

    J'ai écrit un EditorKit avec une classe hérité de ParagraphView, afin de permettre le retour à la ligne ou non d'un JTextPane. Il fonctionne bien. J'ai un flag pour retour à la ligne/pas de retour à la ligne.

    Mais je ne parviens pas à mettre à jour le JTextPane par rapport à l'état du flag. Je pensais qu'un revalidate() le permettrais, ben non. Graphiquement, le JTextPane reste pareil, à moins de redimensionner la fenêtre ou d'ajouter ou supprimer des caractères, là il ce met à jour.

    Voici le code qui illustre ceci :

    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
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFrame;
    import javax.swing.JTextPane;
    import javax.swing.JToggleButton;
    import javax.swing.text.AbstractDocument;
    import javax.swing.text.Element;
    import javax.swing.text.JTextComponent;
    import javax.swing.text.ParagraphView;
    import javax.swing.text.StyledEditorKit;
    import javax.swing.text.View;
    import javax.swing.text.ViewFactory;
     
    public class Essai {
     
    	protected static ViewFactory defaultFactory;
     
    	public static void main(String[] args) {
    		new Essai();
    	}
     
    	public Essai() {
    		final JTextPane editor = new JTextPane();
    		final EditorKitExtended kit = new EditorKitExtended(editor);
    		editor.setEditorKit(kit);
    		editor.setText("mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm\noooooooo");
    		final JFrame frame = new JFrame();
    		frame.setSize(200, 400);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.getContentPane().setLayout(new GridLayout(2,1));
    		frame.getContentPane().add(editor);
    		final JToggleButton activeWrap = new JToggleButton("auto wrap");
    		activeWrap.addActionListener(new ActionListener() {
    		      public void actionPerformed(ActionEvent evt) {
    		    	  if (activeWrap.isSelected()) {
    		    		  kit.setAutoWordWrap(true);
    		    	  }
    		    	  else {
    		    		  kit.setAutoWordWrap(false);
    		    	  }
    		      }
    		    });
    		frame.getContentPane().add(activeWrap);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
     
    	public class EditorKitExtended extends StyledEditorKit {
     
    	    private JTextComponent theTextComponent;
    	    private boolean autoWordWrap = false;
     
    	    public EditorKitExtended(JTextComponent jTextComponent) {
    			super();
    			this.theTextComponent = jTextComponent;
     
    		}
     
     
    	    public ViewFactory getViewFactory() {
    	        if (defaultFactory == null) defaultFactory = new ExtendedViewFactory(super.getViewFactory());
    	        return defaultFactory;
    	    }
     
    	    public boolean isAutoWordWrap() {
    			return autoWordWrap;
    		}
     
    		public void setAutoWordWrap(boolean autoWordWrap) {
    			this.autoWordWrap = autoWordWrap;
    			// theTextComponent.revalidate() ne permet pas de mettre à jour le composant
    			theTextComponent.revalidate();
    		}
     
     
     
    	    private class ExtendedViewFactory implements ViewFactory {
    	        private ViewFactory parentViewFactory;
     
    	        ExtendedViewFactory(ViewFactory parentViewFactory){
    	            super();
    	            this.parentViewFactory = parentViewFactory;
    	        }
     
    	        public View create(Element elem) {
    	            if (AbstractDocument.ParagraphElementName.equals(elem.getName())) 
    					return new TabParagraphView(elem);
    	            return parentViewFactory.create(elem);
    	        }
    	    }
     
     
     
    		public class TabParagraphView extends ParagraphView {
     
    	    	TabParagraphView(Element elem) {
    				super(elem);
    			}
     
    	    	@Override
    			protected void layout(int width, int height) {
    				if (!autoWordWrap) super.layout(Short.MAX_VALUE, height);
    				else super.layout(width, height);
    			}
     
    			@Override
    			public float getMinimumSpan(int axis) {
    				if (!autoWordWrap) return super.getPreferredSpan(axis);
    				else return super.getMinimumSpan(axis);
    		    }	
    		}
    	}
     
    }

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    autoWordWarp(true/false) change un comportement qui se déclenchera au prochain event tel qu'un redimensionnement, mais il ne force pas un wrap.

    Essai de déclarer autoWordWrap(true) au moment de créer ta variable kit et avant de la lier a ton EditorPane. Il est possible qu'il soit à false par défaut.

    setText() devrait déclencher un event qui appliquera alors les settings de ton "kit".

    Du coup ton actionPerformed ne fait que changer l'état d'un comportement sans demander d'action.

  3. #3
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Du coup ton actionPerformed ne fait que changer l'état d'un comportement sans demander d'action.
    On est bien d'accord, c'est justement ça le problème.

    De plus, bien évidemment, ce changement doit-être dynamique. Si je paramètre cet état avant de le lier au JTextPane, cela marche parfaitement.

    Le problème est, lors d'un changement de cet état, de modifier du même coup l'apparence du JTextPane, sans attendre que l'utilisateur ajoute un caractère ou redimensionne la fenêtre.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    Et si tu crés un listener sur ton JTextPane qui fire un event de ce composant qui aura donc l'effet souhaité?

    Le Listener écouterait l'état du texte et en cas de changement, déclencherait l'actionPerformed qui est normalement appelé par d'autre manipulation tel qu'un resize().

  5. #5
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Bon, j'ai trouvé cette solution qui n'est vraiment pas super, mais qui fonctionne et permet de régler la problématique. Elle vaut ce qu'elle vaut. Je la post quand même, elle peut éventuellement servir à d'autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Document oldDoc = theTextComponent.getDocument();
    		int oldCaretPos = theTextComponent.getCaretPosition();
    		if (oldDoc instanceof PlainDocument) {
    			theTextComponent.setDocument(new PlainDocument());
    		}
    		else if (oldDoc instanceof DefaultStyledDocument) {
    			theTextComponent.setDocument(new DefaultStyledDocument());
    		}
    		theTextComponent.setDocument(oldDoc);
    		theTextComponent.setCaretPosition(oldCaretPos);
    Je ne marque cependant pas la discussion comme résolu, au cas où quelqu'un aurait une solution plus "propre".

Discussions similaires

  1. Réponses: 16
    Dernier message: 08/04/2013, 22h41
  2. Réponses: 75
    Dernier message: 09/11/2011, 08h00
  3. Réponses: 22
    Dernier message: 15/12/2010, 01h15
  4. Réponses: 3
    Dernier message: 04/06/2010, 13h40
  5. Le guide du développeur pour iTunes Connect mis à jour
    Par Marcos Ickx dans le forum Apple
    Réponses: 0
    Dernier message: 16/02/2010, 22h16

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