如何设置滚动到顶部 - 在Jscrollpane中有多个JTextareas的JPanel

时间:2017-03-22 19:30:40

标签: java swing user-interface jpanel jscrollpane

我在JScrollPane中有一个JPanel。 JPanel垂直包含多个JTextAreas。

每当刷新页面时,我都希望将滚动窗格的滚动保持在顶部。 目前,滚动始终从底部开始。

这是我目前的代码,它不起作用..

    panel.invalidate();
    panel.revalidate();
    panel.repaint();
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            ((JPanel) panel).setLocation(new Point(0, 0));
        }
    });

我也尝试将下面的代码添加到滚动窗格,但它不起作用..

scrollPanel.getViewport().setViewPosition( new Point(0, 0) );

我查看了其他stackoverflow问题,他们在Jscrollpane中使用Jtextarea(他们使用setCaretPosition(0)解决了它,但是我不能对面板使用相同的功能)。就我而言,还有一个额外的层。

我该如何解决这个问题??

编辑**

根据Pavlo Viazovskyy的建议,我也在下面尝试了这个,它仍然不适合我.. :(

    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            scrollPane.getVerticalScrollBar().setValue(0);
        }
    });

2 个答案:

答案 0 :(得分:3)

非常感谢您的所有评论。 对不起,我没有在问题中提供一个完整的例子,因为涉及的课程太多了。

在我的情况下,在ScrollPane里面的Panel里面的textareas,我默认使用setViewPosition方法在invokelater方法中使用scrollPane将滚动设置到顶部。

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        scrollPane.getViewport().setViewPosition( new Point(0, 0) );
    }
});

答案 1 :(得分:2)

如果您无法直接访问JScrollPane,则只需使用JComponent#scrollRectToVisible

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class ScrollTest {

    public static void main(String[] args) {
        new ScrollTest();
    }

    public ScrollTest() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Test");
                frame.add(new JScrollPane(new BigPane()));
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class BigPane extends JPanel {

        public BigPane() {
            setLayout(new BorderLayout());
            JButton scroll = new JButton("Scroll to top");
            add(scroll, BorderLayout.SOUTH);
            scroll.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    scrollRectToVisible(new Rectangle(0, 0, 1, 1));
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

    }

}

是的,您可以遍历组件层次结构,直到找到JViewport,但此方法适合您。

请记住,Rectangle是相对于调用该方法的组件,因此如果我使用JButton代替它,它会尝试使JButton可见,而不是面板