Je dois faire défiler un JScrollPane vers le bas. JScrollPane contient un JPanel, qui contient un certain nombre de JLabel.
Pour faire défiler vers le haut, je fais juste:
scrollPane.getViewport().setViewPosition(new Point(0,0));
mais comment puis-je faire défiler exactement vers le bas? (Trop loin et ça craint)
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() );
Après de nombreuses heures de tentatives pour trouver une réponse autre que celle utilisant la méthode scrollRectToVisible (), j'ai réussi. J'ai constaté que si vous utilisez le code suivant après avoir généré du texte dans la zone de texte du panneau de défilement, le focus sera automatiquement placé au bas de la zone de texte.
textArea.setCaretPosition(textArea.getDocument().getLength());
Donc, au moins pour moi, ma méthode d'impression ressemble à ceci
public void printMessage(String message)
{
textArea.append(message + endL);
textArea.setCaretPosition(textArea.getDocument().getLength());
}
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
}
});
Au lieu de setViewPosition()
, j’utilise habituellement scrollRectToVisible()
, décrit dans Comment utiliser les panneaux de défilement . Vous pouvez utiliser le résultat de la fonction getBounds()
d'une étiquette appropriée pour la variable Rectangle
requise.
Addendum: @Matt note dans un autre answer , "Si vous utilisez le code suivant après avoir inséré du texte dans la zone de texte du volet de navigation, il se concentrera automatiquement sur le bas de celle-ci."
Dans le cas particulier d'une JTextComponent
, envisagez également d'utiliser la méthode setUpdatePolicy()
de DefaultCaret
à ALWAYS_UPDATE
, illustrée ici .
J'ai adapté le code de Peter Saitz . Cette version laisse la barre de défilement opérationnelle une fois le défilement terminé.
private void scrollToBottom(JScrollPane scrollPane) {
JScrollBar verticalBar = scrollPane.getVerticalScrollBar();
AdjustmentListener downScroller = new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
Adjustable adjustable = e.getAdjustable();
adjustable.setValue(adjustable.getMaximum());
verticalBar.removeAdjustmentListener(this);
}
};
verticalBar.addAdjustmentListener(downScroller);
}
Si votre JScrollPane contient uniquement un JTextArea, alors:
JScrollPane.getViewport().setViewPosition(new Point(0,JTextArea.getDocument().getLength()));
ScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() - 1 );
il suffit de définir la valeur sur: vertical.getMaximum() - 1
J'ai essayé plusieurs méthodes. Certains utilisent bar.setValue(bar.getMaximum())
, mais le maximum est toujours 100 alors que la plage de barres sera beaucoup plus que 100. Certains utilisent textArea, mais cela ne convient pas, il n'y a qu'une JTable dans le JScrollPane. Et je pense à une méthode, peut-être stupide mais efficace.
JScrollBar bar=jsp.getVerticalScrollBar();
int x=bar.getValue();
for(int i=100;i<2000000000;i+=100)
{
bar.setValue(i);
if(x==bar.getValue())
break;
x=bar.getValue();
}
// Scroll to bottom of a JScrollPane containing a list of Strings.
JScrollPane scrollPane;
DefaultListModel listModel;
JList list;
listModel = new DefaultListModel();
list = new JList(listModel);
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
list.setVisibleRowCount(-1); // -1 = display max items in space available
scrollPane = new JScrollPane(list);
scrollPane.setPreferredSize(new Dimension(200, 50));
// Append text entries onto the text scroll pane.
listModel.addElement("text entry one");
listModel.addElement("text entry two");
listModel.addElement("text entry three");
listModel.addElement("text entry four");
// Get the index of the last entry appended onto the list, then
// select it, and scroll to ensure it is visible in the vewiport.
int lastNdx = listModel.getSize() - 1;
list.setSelectedIndex(lastNdx);
list.ensureIndexIsVisible(lastNdx);
JPanel panel = new JPanel();
panel.add(scrollPane);
Je souhaitais apporter mes conclusions à cette question, car j’avais besoin d’une réponse aujourd’hui, et aucune des solutions ici ne fonctionnait pour moi, mais j’en ai finalement trouvé une. J'avais un objet JList enveloppé dans un JScrollPane que je voulais faire défiler jusqu'au dernier élément après que tous les éléments avaient été ajoutés à un DefaultListModel. Cela fonctionne essentiellement comme ceci:
JList list = new JList();
DefaultListModel listModel = new DefaultListModel();
JScrollPane listScroller = new JScrollPane(list);
public void populateList()
{
//populate the JList with desired items...
list.ensureIndexIsVisible(listModel.indexOf(listModel.lastElement()));
}
J'ai essayé toutes les solutions énumérées ici mais aucune ne semblait avoir aucun effet. J'ai trouvé celui-ci en expérimentant, et cela fonctionne parfaitement. Je pensais que je le laisserais ici au cas où cela pourrait aider quelqu'un d'autre.