web-dev-qa-db-fra.com

Faites défiler JScrollPane jusqu'au bas

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)

42
Matt
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() );
100
camickr

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());
}
35
Decesus
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
    public void adjustmentValueChanged(AdjustmentEvent e) {  
        e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
    }
});
24
Peter Saitz

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 .

16
trashgod

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);
}
11
Matthias Braun

Si votre JScrollPane contient uniquement un JTextArea, alors:

JScrollPane.getViewport().setViewPosition(new Point(0,JTextArea.getDocument().getLength()));
1
Gonzalo
ScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() - 1 );

il suffit de définir la valeur sur: vertical.getMaximum() - 1

0
pereca

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();
}
0
GAOLE LI
// 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);
0
gghptg

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.

0
hektik