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 :

Editeur de texte et ScrollPane


Sujet :

Composants Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Editeur de texte et ScrollPane
    Bonjour,

    J'utilise un éditeur de texte de type JTextArea dans une appli Java Swing.

    Je place ce composant dans un scrollpane.

    Actuellement, quand je suis sur la dernière ligne visible et que je dois aller à la ligne, le verticalscrollbar se déplace d'une ligne vers le bas.
    Ainsi je vois ma nouvelle ligne, mais elle est tout en bas de la partie visible du viewport.
    J'aimerai trouver une solution pour avoir un peu plus de mon viewport qui soit visible en dessous de cette dernière ligne, de sorte que je ne sois pas à chaque fois tout en bas de l'écran.

    Je ne sais pas si je suis assez clair...
    Faites l'essai avec libreoffice writer par exemple: faites "entrée" jusqu'à arriver en bas de la partie visible, vous verrez que la prochaine entrée ne placera pas le curseur tout en bas de l'écran.

    Merci de votre lecture... si vous avez une idée, je suis preneur!

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Rajouter des lignes vides à la fin et donc insérer du texte avant ces lignes vides.
    C'est en respectant les autres que l'on se fait respecter.

  3. #3
    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,

    Citation Envoyé par Patrice Henrio Voir le message
    Rajouter des lignes vides à la fin et donc insérer du texte avant ces lignes vides.
    Oui, enfin, ça ne fonctionne pas vraiment, parce que s'il existe des lignes vides à la fin, on peut déplacer le curseur dedans. Et on peut les supprimer aussi, en ajouter après, etc. Donc il faudrait mettre en place un DocumentFilter pour empêcher de saisir dedans, un CaretListener pour éviter de déplacer le curseur dedans, et d'autres traitement pour que lorsqu'on arrive dans la dernière ligne avant ces lignes vides, le scroll se fasse pour que la dernière ligne soit visible.

    En théorie, il faudrait paramétrer le JScrollpane, voire réimplémenter un scrollpane dédié avec une scrollbar et un viewport avec un traitement adéquate, en fonction de la position du curseur dans les texte. C'est assez sioux à mettre au point de manière générique (si on se contente de texte de base non stylé, sans image ni autre composant) ça peut largement se simplifier parce que la taille du viewport est le produit du nombre de lignes par la hauteur d'une ligne).

    Une approche plus simple est de jouer sur la taille du viewport, en l'augmentant d'un offset arbitraire, et d'écouter juste le caret juste pour forcer le repositionnement lorsqu'on arrive sur la dernière ligne. Voici un POC rapidement fait (ce n'est pas nickel, pas tout à fait identique à ce que fait Libreoffice, mais c'est un canevas de départ pour montrer l'idé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
    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
    public class JEditorPaneDemo {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JEditorPane editor = new JEditorPane() {
    			public java.awt.Dimension getPreferredSize() {
    				Dimension size = super.getPreferredSize();
    				size.height+=100;
    				return size;
    			}
    		};
     
    		editor.setText(createText()); 
     
    		JScrollPane scrollpane = new JScrollPane(editor,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    		scrollpane.getViewport().setBackground(editor.getBackground());
     
    		frame.add(scrollpane);
     
    		editor.addCaretListener(new CaretListener() {
     
    			@Override
    			public void caretUpdate(CaretEvent event) { 
    				try {
    					scrollToEnd(scrollpane, editor, event.getDot());
    				} catch (BadLocationException e) {
    				}
    			}
    		});
     
    		frame.setSize(400, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	protected static int lineCount(JEditorPane editor) {
    		int totalCharacters = editor.getText().length(); 
    		return lineCount(editor, totalCharacters);
    	}
     
    	protected static int lineCount(JEditorPane editor, int offset) {
    		int totalCharacters = editor.getText().length(); 
    		int lineCount = (totalCharacters == 0) ? 1 : 0;
    		try {
    		   while (offset > 0) {
    		      offset = javax.swing.text.Utilities.getRowStart(editor, offset) - 1;
    		      lineCount++;
    		   }
    		} catch (BadLocationException e) {
    		}
    		return lineCount;
    	}
     
    	protected static boolean scrollToEnd(JScrollPane scrollpane, JEditorPane editor, int pos) throws BadLocationException {
    		int last=lineCount(editor);
    		if ( last==0 ) return false;
    		int current=lineCount(editor, pos);
    		if ( current==last) {
    			SwingUtilities.invokeLater(()->
    			scrollpane.getVerticalScrollBar().getModel().setValue(scrollpane.getVerticalScrollBar().getModel().getMaximum()));
    			return true;
    		}
    		return false;
    	}
     
    	private static String createText() {
    		StringBuilder sb=new StringBuilder("1 ");
    		int n=2;
    		for(int i=0;i<300; i++) {
    			if ( i>0 && i%ThreadLocalRandom.current().nextInt(3, 7)==0 ) {
    				sb.append("\n"+n+" ");
    				n++;
    			}
    			else if ( sb.length()!=0) {
    				sb.append(" ");
    			}
    			sb.append("blah");
    		}
    		return sb.toString();
    	}
     
    }
    une autre approche est d'essayer de présenter un contenu de viewport spécifique :

    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
    public class JEditorPaneDemo {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		Box editorPanel = new Box(BoxLayout.PAGE_AXIS);
    		JEditorPane editor = new JEditorPane();
    		editorPanel.add(editor);
    		editorPanel.add(Box.createVerticalStrut(100));
     
    		editor.setText(createText()); 
     
    		JScrollPane scrollpane = new JScrollPane(editorPanel,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    		scrollpane.getViewport().setBackground(editor.getBackground());
    		editor.addCaretListener(new CaretListener() {
     
    			@Override
    			public void caretUpdate(CaretEvent event) { 
    				try {
    					if ( !scrollToEnd(scrollpane, editor, event.getDot()) ) {
    						scrollToEnd(scrollpane, editor, event.getMark());
    					}
    				} catch (BadLocationException e) {
    				}
    			}
    		});
    		editor.getDocument().addDocumentListener(new DocumentListener() {
     
    			@Override
    			public void removeUpdate(DocumentEvent e) {
     
    			}
     
    			@Override
    			public void insertUpdate(DocumentEvent e) {
    				update();
    			}
     
    			@Override
    			public void changedUpdate(DocumentEvent e) {
    				update();
    			}
     
    			private void update() {
    				try {
    					scrollToEnd(scrollpane, editor, editor.getCaret().getDot());
    				} catch (BadLocationException e) {
    				}
    			}
    		});
     
    		frame.add(scrollpane);
     
    		frame.setSize(400, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	protected static int lineCount(JEditorPane editor) {
    		int totalCharacters = editor.getText().length(); 
    		return lineCount(editor, totalCharacters);
    	}
     
    	protected static int lineCount(JEditorPane editor, int offset) {
    		int totalCharacters = editor.getText().length(); 
    		int lineCount = (totalCharacters == 0) ? 1 : 0;
    		try {
    		   while (offset > 0) {
    		      offset = javax.swing.text.Utilities.getRowStart(editor, offset) - 1;
    		      lineCount++;
    		   }
    		} catch (BadLocationException e) {
    		}
    		return lineCount;
    	}
     
    	protected static boolean scrollToEnd(JScrollPane scrollpane, JEditorPane editor, int pos) throws BadLocationException {
    		int last=lineCount(editor);
    		if ( last==0 ) return false;
    		int current=lineCount(editor, pos);
    		if ( current==last) {
    			SwingUtilities.invokeLater(()->
    			scrollpane.getVerticalScrollBar().getModel().setValue(scrollpane.getVerticalScrollBar().getModel().getMaximum()));
    			return true;
    		}
    		return false;
    	}
     
    	private static String createText() {
    		StringBuilder sb=new StringBuilder("1 ");
    		int n=2;
    		for(int i=0;i<300; i++) {
    			if ( i>0 && i%ThreadLocalRandom.current().nextInt(3, 7)==0 ) {
    				sb.append("\n"+n+" ");
    				n++;
    			}
    			else if ( sb.length()!=0) {
    				sb.append(" ");
    			}
    			sb.append("blah");
    		}
    		return sb.toString();
    	}
     
    }
    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.

Discussions similaires

  1. [Composant] Editeur de texte java
    Par doudine dans le forum Général Java
    Réponses: 17
    Dernier message: 27/01/2010, 17h35
  2. [Composant] Editeur de texte
    Par fendavid dans le forum Général Java
    Réponses: 1
    Dernier message: 05/06/2004, 23h28
  3. [Kylix] [Kylix 3] Un editeur de texte ?
    Par drfreuderick dans le forum EDI
    Réponses: 2
    Dernier message: 14/03/2004, 01h33
  4. [Flash MX] texte et scrollPane
    Par dens63 dans le forum Flash
    Réponses: 11
    Dernier message: 21/11/2003, 18h40
  5. Quel EDI/editeur de texte preférez-vous ?
    Par Gandalf dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 18/09/2003, 18h55

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