滚动到JScrollPane中的顶部JPanel

时间:2013-10-16 09:52:45

标签: java swing scroll jpanel jscrollpane

我知道很多人都问过这个问题,但我还是无法解决这个问题。 我在JScrollPane中有一个JPanel。 JPanel包含六个动态加载的面板。 加载面板后,系统会垂直自动滚动到面板中间。 我必须避免这种情况,所以我尝试了这个:

panel.scrollRectToVisible(scrollPane.getBounds());

但它不起作用。 我的scrollPane已经以这种方式创建

JScrollPane scrollPane= new JScrollPane();
scrollPane.setBounds(panel.getBounds());
scrollPane.setViewportView(panel);

你能帮助我吗?

1 个答案:

答案 0 :(得分:4)

  1. panel.scrollRectToVisible(scrollPane.getBounds());应为panel.scrollRectToVisible(JPanelAddedOnRuntime.getBounds());

  2. 其余代码(在此处发布)不可行,

  3. 更快地发布SSCCE,简短,可运行,可编辑

  4. 修改

    再次运作,你需要重新阅读我的第3个以上。点

    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.util.Vector;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class ScrollTesting {
    
        private JPanel panel = new JPanel();
        private JScrollPane scrollPane = new JScrollPane(panel);
        private Vector<JTextField> fieldsVector = new Vector<JTextField>();
        private Dimension preferredSize = new Dimension(400, 40);
        private Font font = new Font("Tahoma", 1, 28);
    
        public ScrollTesting() {
            panel.setLayout(new GridLayout(100, 1));
            for (int i = 0; i < 100; i++) {
                fieldsVector.addElement(new JTextField());
                fieldsVector.lastElement().setPreferredSize(preferredSize);
                fieldsVector.lastElement().setFont(font);
                panel.add(fieldsVector.lastElement());
            }
            JFrame frame = new JFrame();
            frame.setSize(400, 300);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(scrollPane);
            frame.setVisible(true);
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JTextField tf = (JTextField) fieldsVector.lastElement();
                    panel.scrollRectToVisible(tf.getBounds());
                }
            });
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    ScrollTesting scrollTesting = new ScrollTesting();
                }
            });
        }
    }