Faites défiler JScrollPane à fond
J'ai besoin de faire défiler un JScrollPane vers le bas. Le JScrollPane contient un Composite qui contient un certain nombre de JLabel est.
Pour faire défiler vers le haut, je viens de faire:
scrollPane.getViewport().setViewPosition(new Point(0,0));
mais comment faire défiler exactement vers le bas? (Trop loin et il frousse)
- je suppose que la position y serait de la taille du document - vue du port de la taille.
- +1 pour le hatrick de plugins commençant par un J*
Vous devez vous connecter pour publier un commentaire.
setUpdatePolicy()
, aussi examiné par camickrvalidate()
sur le composant avec la barre de défilement, avant de définir la barre de défilement à sa valeur maximale. Ceci est pour s'assurer que vous obtenez la dernière mise à jour le maximum de valeur, si vous avez ajouté ou supprimé un élément de la composante. SSCCE version sur Pastebin: pastebin.com/v1xi35ZKvalidation()
méthodes.Après de nombreuses heures à tenter de trouver une réponse autre que celle à l'aide de la scrollRectToVisible() la méthode, j'ai réussi. J'ai trouvé que si vous utilisez le code suivant après la sortie de texte dans la zone de texte dans le composant scrollpane, il va automatiquement se concentrer sur le bas de la zone de texte.
Donc, au moins pour moi, ma méthode d'impression ressemble à ceci
JTextComponent
, pensez également àDefaultCaret#setUpdatePolicy()
, illustré ici.if(e.getAdjustable().getMaximum() != prevMax) {/*set the value*/}
Au lieu de
setViewPosition()
, j'ai l'habitude d'utiliserscrollRectToVisible()
, décrit dans Comment Utiliser le Défilement des Volets. Vous pouvez utiliser le résultat d'une étiquette appropriée degetBounds()
pour leRectangle
.Addendum: @Matt notes dans un autre réponse, "Si vous utilisez le code suivant après la sortie de texte dans la zone de texte dans le composant scrollpane, il va automatiquement se concentrer sur le bas de la zone de texte."
Dans le cas particulier d'un
JTextComponent
, pensez également à utiliser lesetUpdatePolicy()
méthode deDefaultCaret
àALWAYS_UPDATE
, illustré ici.setViewPosition()
(ou d'autres méthodes vous avez utilisé) sur une base régulière Composite? Ou est-ce seulement possible sur un JScrollPane pour se déplacer à l'intérieur de la fenêtre?scrollRectToVisible()
: stackoverflow.com/a/6132046/1143274 Cela a fonctionné pour moi, alors que((DefaultCaret)this.jtextpane.getCaret()).setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
initialement semblait fonctionner, mais sous certaines conditions, j'ai remarqué qu'il n'était pas le défilement vers le bas. Il est difficile de dire quelles sont ces conditions.J'ai adapté le code de Pierre Saitz. Cette version des feuilles de la barre de défilement de travail après il a fini de faire défiler vers le bas.
Si votre JScrollPane ne contient qu'un JTextArea alors:
Aucune réponse n'a fonctionné pour moi. Pour une raison quelconque, mon
JScrollPane
n'était pas le défilement vers le bas, même si j'ai validé tout.C'est ce qui a fonctionné pour moi:
J'ai essayé plusieurs méthode. Certains utilisent
bar.setValue(bar.getMaximum())
, mais le maximum est toujours de 100, tandis que la plage de la barre beaucoup plus que 100. Certains textArea, mais il n'est pas adapté pour qu'il y est seulement une JTable dans le JScrollPane. Et j'chose au sujet d'une méthode, peut-être stupide mais efficace.Je voulais apporter ma contribution résultats à cette question, car j'ai besoin d'une réponse pour aujourd'hui, et aucune des solutions ici a fonctionné pour moi, mais j'ai finalement trouver un qui l'a fait. J'ai eu une JList objet enveloppé dans un JScrollPane qui je voulais faire défiler vers le dernier élément après tous ces éléments ont été ajoutés à un DefaultListModel. Fondamentalement, il fonctionne comme ceci:
J'ai essayé toutes les solutions proposées ici, mais aucun ne semble avoir aucun effet. J'ai trouvé celui-ci tout en expérimentant, et il fonctionne parfaitement. J'ai pensé le laisser ici dans le cas où ça pourrait aider quelqu'un d'autre.
juste valeur de consigne de:
vertical.getMaximum() - 1
Si vous regardez le JTextArea documentation
public void select(int selectionStart
int selectionEnd)
Sélectionne le texte entre le début et la fin de positions.
Cette méthode permet de définir le début et la fin de positions du texte sélectionné, l'application de la restriction que la position de départ doit être supérieure ou égale à zéro. La position de fin doit être supérieure ou égale à la position de départ, et inférieure ou égale à la longueur du texte de texte du composant.
Si l'appelant fournitures de valeurs qui sont incompatibles ou en dehors des limites, la méthode impose ces contraintes en silence, et sans échec. Plus précisément, si la position de début ou de fin de course est plus grande que la longueur du texte, il est remis à l'égalité de la longueur du texte. Si la position de départ est inférieur à zéro, il est remis à zéro, et si la position de fin de course est inférieure à la position de départ, il est remis à la position de départ.
Donc la solution la plus simple est jTextArea.sélectionnez(Integer.MAX_VALUE, 0); et que Java tri!