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

How to set scroll to the top - JPanel that has multiple JTextareas inside 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) );

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

我该如何解决这个..?

编辑**

根据 Pavlo Viazovskyy 的建议,我也在下面尝试了这个,但它仍然对我不起作用..:(

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

非常感谢您的所有评论。 抱歉,我没有在问题中给出完整的适当示例,因为涉及的不同 类 太多了..

在我的例子中,在 ScrollPane 内的 Panel 内的 textareas,我通过在 invokelater 方法中使用 setViewPosition 方法滚动到 scrollPane 默认情况下滚动到顶部。

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

当您无法直接访问 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 可见,不是面板