Java Scroll JScrollPane с JPanel внутри вниз - PullRequest
5 голосов
/ 26 мая 2011

У меня есть JScrollPane с очень высоким JPanel внутри, который динамически изменяется, элементы добавляются в его конце.То, что я хочу, это прокрутить до конца вышеупомянутой JScrollPane, чтобы вновь добавленные элементы были видны сразу после добавления (они не добавляются непосредственно к панели прокрутки, а к ее JPanel и являются частными объектами, поэтому не могут бытьссылка.

Как я могу просто прокрутить эту панель прокрутки до самого дна? Заранее спасибо!

Ответы [ 4 ]

16 голосов
/ 26 мая 2011

JComponent.scrollRectToVisible(Rectangle).Вызовите это на экземпляре JPanel.

EG

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ScrollToNewLabel {

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                JPanel gui = new JPanel(new BorderLayout(3,3));
                final JPanel panel = new JPanel(new GridLayout(0,1));
                JScrollPane scroll = new JScrollPane(panel);
                scroll.setPreferredSize(new Dimension(80,100));
                gui.add(scroll, BorderLayout.CENTER);
                JButton addLabel = new JButton("Add Label");
                gui.add(addLabel, BorderLayout.NORTH);
                ActionListener listener = new ActionListener() {
                    int counter = 0;
                    public void actionPerformed(ActionEvent ae) {
                        panel.add(new JLabel("Label " + ++counter));
                        panel.revalidate();
                        int height = (int)panel.getPreferredSize().getHeight();
                        Rectangle rect = new Rectangle(0,height,10,10);
                        panel.scrollRectToVisible(rect);
                    }
                };
                addLabel.addActionListener(listener);
                JOptionPane.showMessageDialog(null, gui);
            }
        });
    }
}

Снимок экрана

enter image description here

EG 2

Это, например, основано на ответе Винсента , для использования JScrollPane.getVerticalScrollBar(). setValue(height).Где height - предпочтительная высота панели в пикселях.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ScrollToNewLabel {

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                JPanel gui = new JPanel(new BorderLayout(3,3));
                final JPanel panel = new JPanel(new GridLayout(0,1));
                final JScrollPane scroll = new JScrollPane(panel);
                scroll.setPreferredSize(new Dimension(80,100));
                gui.add(scroll, BorderLayout.CENTER);
                JButton addLabel = new JButton("Add Label");
                gui.add(addLabel, BorderLayout.NORTH);
                ActionListener listener = new ActionListener() {
                    int counter = 0;
                    public void actionPerformed(ActionEvent ae) {
                        panel.add(new JLabel("Label " + ++counter));
                        panel.revalidate();
                        int height = (int)panel.getPreferredSize().getHeight();
                        scroll.getVerticalScrollBar().setValue(height);
                    }
                };
                addLabel.addActionListener(listener);
                JOptionPane.showMessageDialog(null, gui);
            }
        });
    }
}
2 голосов
/ 26 мая 2011

scrollRectToVisible (...) и scrollBar.setValue (...) являются общими решениями.

Возможно, вас заинтересует Прокрутка формы , которая гарантирует, что при переходе к компоненту форма автоматически прокручивается, чтобы убедиться, что компонент будет виден в области прокрутки. За кулисами он использует scrollRectToVisible ().

0 голосов
/ 14 июля 2015

Это то, как я прокручиваю программно вниз.

Мне нравится, как он плавно перемещается к основанию, вместо того, чтобы сразу же прыгать туда.

0 голосов
/ 26 мая 2011

Простой способ полностью переместить полосу прокрутки вниз - установить ее значение на 100 следующим образом:

  scroll.getVerticalScrollBar().setValue(100);

Это заставит его переместиться в конец области просмотра. Вы можете добавить это после добавления компонента на панель.

...