Question

J'ai incorporé un JTextArea sur un JScrollPane et j'utilise ce JTextArea pour la sortie.

Je souhaite que chaque fois que la sortie dépasse la taille de JTextArea, JTextArea défile automatiquement afin que l'utilisateur ne soit pas obligé de faire défiler manuellement l'affichage pour afficher la sortie récente.

Comment puis-je faire cela?

J'ai déjà défini la propriété autoscroll de JTextArea et JScrollPane sur true.

Était-ce utile?

La solution

Lorsque vous utilisez JDK1.4.2 (ou une version antérieure), la suggestion la plus courante que vous trouverez dans les forums est d'utiliser un code similaire à celui-ci:

textArea.append(...);
textArea.setCaretPosition(textArea.getDocument().getLength());

Cependant, je viens de remarquer que dans JDK5, ce problème avait été résolu par une modification de l'API. Vous pouvez maintenant contrôler ce comportement en définissant une propriété sur le DefaultCaret de la zone de texte. En utilisant cette approche, le code serait:

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

Remarque:

La suggestion ci-dessus de définir la stratégie de mise à jour du curseur ne fonctionne pas.

Vous pouvez plutôt consulter le défilement intelligent , qui donne à l'utilisateur la possibilité de déterminer quand le défilement doit être automatique ou non.

Une description plus détaillée du défilement automatique dans une zone de texte peut être trouvée ici: Défilement de la zone de texte

Autres conseils

    JScrollBar vbar = scrollPane.getVerticalScrollBar();

    for (int i = 0; i < 20; i++) {

        myJTxt.append("This is text " + i + "\n");
        vbar.setValue(vbar.getMaximum());
        vbar.paint(vbar.getGraphics());
        myJTxt.scrollRectToVisible(myJTxt.getVisibleRect());
        myJTxt.paint(myJTxt.getGraphics());
        try {
            Thread.sleep(250);
        } catch (InterruptedException ex) {
            Logger.getLogger(ScrollTextView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Lorsque vous cliquez n'importe où sur JTextArea, le défilement automatique peut être arrêté. Comme la position du curseur a changé une fois, le point de vue a également changé. Pendant ce temps, vous devez définir la position du curseur lorsque vous ajoutez ou ajoutez du texte. En chemin, j’ai créé la méthode, y compris la position du curseur, puis je l’utilise quand il faut ajouter ou ajouter quelque chose.

    JTextArea jTextArea = new JTextArea();
    DefaultCaret caret = (DefaultCaret)jTextArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);

J'ai essayé la plupart des suggestions, mais j'ai rencontré des problèmes lorsque le contenu de JTextArea est volumineux (plusieurs Mo). Enfin, les performances suivantes ont été optimisées:

myTextArea.append( someText );
myTextArea.getCaret().setDot( Integer.MAX_VALUE );

Bien entendu, toute sélection effectuée par l'utilisateur est perdue. Par conséquent, il ne peut être utilisé que pour un affichage "Affichage uniquement". utilisation de la zone de texte.

Néanmoins, dans mon installation, si le contenu de JTextArea dépasse les 9 Mo, il devient un peu inutilisable (interface graphique très lente à presque figée).

Un phénomène similaire se produit lorsque le texte contient des caractères représentés par deux caractères (deux unités de 16 bits) dans le codage UTF-16 (appelées paires de substitution, comme ceci: & # 127801;). J'ai une solution de filtrage, mais peut-être un sujet différent.

Utilisez ceci à la place

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
scrollPane = new JScrollPane();
scrollPane.add(textArea);
scrollPane.setViewportView(textArea);

Essayez ceci:

JTextArea jTextArea = new JTextArea();
JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setViewport(jTextArea);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top