Java滚动JScrollPane,JPanel在底部

时间:2011-05-25 22:30:58

标签: java scroll jpanel jscrollpane

我有一个内置非常高的JPanel的JScrollPane,它会动态更改,项目会在其末尾附加。我想要的是滚动到前面提到的JScrollPane的底部,以便新添加的项目立即可见(它们不会直接附加到滚动窗格,而是附加到其JPanel,并且是私有对象,所以不能引用。

如何让滚动窗格滚动到最底部? 提前谢谢!

3 个答案:

答案 0 :(得分:16)

JComponent.scrollRectToVisible(Rectangle)。在JPanel实例上调用它。

E.G。

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

E.G。 2

例如基于文森特的answer,使用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);
            }
        });
    }
}

答案 1 :(得分:2)

scrollRectToVisible(...)和scrollBar.setValue(...)是一般解决方案。

您可能对Scrolling a Form感兴趣,这可确保当您选择组件时,表单将自动滚动以确保该组件在滚动窗格中可见。在幕后它使用scrollRectToVisible()。

答案 2 :(得分:0)

将滚动条一直移动到底部的简单方法是将其值设置为100,如下所示:

  scroll.getVerticalScrollBar().setValue(100);

这会使它移动到视口的底部。您可以在将组件添加到面板后添加此项。