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);
		    }	
		}
	}
 
}