Java滚动JScrollPane,JPanel位于底部

我有一个JScrollPane,里面有一个非常高的JPanel,可以动态更改,并在其末尾附加项目。我想要的是滚动到上述JScrollPane的底部,以便新添加的项在添加后立即可见(它们不是直接附加到滚动窗格,而是附加到其JPanel,并且是私有对象,因此不能参考。 如何简单地使滚动窗格滚动到最底部? 提前致谢!     
已邀请:
JComponent.scrollRectToVisible(Rectangle)
。在“ 1”实例上调用它。 例如。
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);
            }
        });
    }
}
屏幕截图 例如。 2 例如根据Vincent的答案,使用
JScrollPane.getVerticalScrollBar()
.
setValue(height)
。其中“ 5”是面板的首选高度,以像素为单位。
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);
            }
        });
    }
}
    
scrollRectToVisible(...)和scrollBar.setValue(...)是常规解决方案。 您可能对“滚动表单”感兴趣,这可确保您在选择组件时可以自动滚动表单,以确保该组件在滚动窗格中可见。在幕后,它使用scrollRectToVisible()。     
将滚动条一直移动到底部的一种简单方法是将其值设置为100,如下所示:
  scroll.getVerticalScrollBar().setValue(100);
这使它移到视口的底部。您可以在将组件添加到面板后添加它。     
这就是我以编程方式向下滚动的方式。 我喜欢它平滑地滚动到底部而不是立即跳到底部的方式。
/**
 * Scrolls a {@code scrollPane} to its bottom.
 * 
 * @param scrollPane
 *            the scrollPane that we want to scroll all the way down
 * 
 */
private void scrollDown(JScrollPane scrollPane) {
    JScrollBar verticalBar = scrollPane.getVerticalScrollBar();

    int currentScrollValue = verticalBar.getValue();
    int previousScrollValue = -1;

    while (currentScrollValue != previousScrollValue) {
        // Scroll down a bit
        int downDirection = 1;
        int amountToScroll = verticalBar.getUnitIncrement(downDirection);
        verticalBar.setValue(currentScrollValue + amountToScroll);

        previousScrollValue = currentScrollValue;
        currentScrollValue = verticalBar.getValue();
    }
}
    

要回复问题请先登录注册