Maintenant JTextArea la position de défilement

J'ai un JScrollPane avec un JTextArea définir comme sa vue sur le port.

- Je mettre à jour le (multi-ligne) texte affiché sur le JTextArea en permanence environ une fois par seconde. Chaque fois que le texte des mises à jour, JScrollPane va tout le chemin vers le bas du texte.

Au lieu de cela, j'aimerais comprendre le numéro de la ligne qui est actuellement affichée à la première ligne dans le texte original, et pour que la ligne soit la première ligne affiche lorsque le texte a été mis à jour (ou si le nouveau texte n'a pas que le nombre de lignes, puis faites défiler tout le chemin vers le bas).

Ma première tentative de le faire, c'était d'obtenir la position actuelle de signe, figure la ligne de base, et ensuite définir la zone de texte pour montrer que ligne:

    int currentPos = textArea.getCaretPosition();
    int currentLine = 0;
    try {
        for(int i = 0; i < textArea.getLineCount(); i++) {
            if((currentPos >= textArea.getLineStartOffset(i)) && (currentPos < gameStateTextArea.getLineEndOffset(i))) {
                currentLine = i;
                break;
            }
        }
    } catch(Exception e) { }

    textArea.setText(text);

    int newLine = Math.min(currentLine, textArea.getLineCount());
    int newOffset = 0;
    try {
        newOffset = textArea.getLineStartOffset(newLine);
    } catch(Exception e) { }

    textArea.setCaretPosition(newOffset);

C'était presque acceptable pour mes besoins, mais oblige l'utilisateur à cliquer à l'intérieur de la zone de texte pour modifier la position du curseur, ainsi que le défilement maintenir l'état (ce qui n'est pas agréable).

Comment pourrais-je faire cela en utilisant l' (vertical) de la position de défilement de la place ?

Je viens de réaliser: JTextArea gère son propre défilement! C'est probablement saboter nos efforts de contrôle de l'incorporation de JScrollPane.
OK, je l'ai eu à travailler. Voir ma mise à jour 2.

OriginalL'auteur Sami | 2010-01-11