J'essaie d'implémenter un JScrollPane avec un JTextArea. JTextArea est ajouté à, et je veux que JScrollPane continue à faire défiler vers le bas à mesure que plus de texte est ajouté. Comment cela peut il etre accompli?
Pour (ce que je pense est) une réponse plus simple consultez: Zone de texte défilement .
Avant JDK5, vous auriez à changer manuellement la position du curseur après chaque ajout. Vous pouvez maintenant donner ce comportement par défaut comme ceci:
JTextArea textArea = new JTextArea(); DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
L'avantage est que vous n'avez pas besoin d'utiliser cet extrait plusieurs fois dans votre code!
J'ai trouvé la réponse ici: JScrollPane et JList auto scroll
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
}
});
Voici la solution.
JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);`
Si vous écrivez constamment des données, vous pouvez utiliser:
textArea.setCaretPosition(textArea.getDocument().getLength());
juste après avoir ajouté les nouvelles données.
Cela ferait automatiquement défiler le JScorllPane.
Un contournement est possible: vous pouvez déclarer cet écouteur en tant que classe puis l'instancier sur l'événement où il est nécessaire. Après quoi, vous pouvez supprimer la classe après avoir forcé une nouvelle peinture de l'écran. Fonctionne comme un charme.
(PS: Edit for SCREEN SHOOT)
import javax.swing.*;
import javax.swing.text.DefaultCaret;
public class NewClass {
public static void main(String[] args) {
JFrame win = new JFrame("test");
win.setSize(800, 500);
win.setResizable(false);
win.setLayout(null);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setLocationRelativeTo(null);
JTextArea txtListNum = new JTextArea();
JScrollPane barList = new JScrollPane(txtListNum);
DefaultCaret crList = (DefaultCaret) txtListNum.getCaret();
crList.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
barList.setLocation(10, 10); // Scrollbar Position
barList.setSize(180, 450); // Scrollbar Dimession
win.add(barList); // Scrolbar add to Frame
win.setVisible(true);
}
}
La solution acceptée fonctionne bien, mais uniquement lorsque la zone de texte est modifiable, c’est-à-dire sans jTextArea.setEditable(false)
. La solution suggérée par Krigath est plus générale, mais présente le problème demandé ici JScrollPane et JList auto scroll . En utilisant les réponses à cette question, vous pouvez obtenir une solution générale, par exemple:
JScrollPane scrollPane = new JScrollPane(jTextArea);
verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
scrollPane.getVerticalScrollBar().addAdjustmentListener(
e -> {
if ((verticalScrollBarMaximumValue - e.getAdjustable().getMaximum()) == 0)
return;
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
});
Le volet ne défile alors que lorsque la barre de défilement verticale est développée, en réponse aux lignes de texte ajoutées.
Je reconnais qu’une méthode pour filtrer les événements sans variables supplémentaires pourrait être trouvée et apprécierais que quelqu'un la publie.