Java ScrollPane(内部有一个TextArea)无法通过编程方式滚动到顶部

Java ScrollPane(内部有一个TextArea)无法通过编程方式滚动到顶部,java,swing,jscrollpane,jtextarea,Java,Swing,Jscrollpane,Jtextarea,为了抽象这个问题,我设置了两个按钮。一个称为“添加和汇总”,另一个称为“汇总” 在最开始的文本区域中没有文本 我为“add&toTop”按钮添加了actionListener,如下所示: btn1.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { textArea1.setText("jh

为了抽象这个问题,我设置了两个按钮。一个称为“添加和汇总”,另一个称为“汇总”

在最开始的文本区域中没有文本

我为“add&toTop”按钮添加了actionListener,如下所示:

btn1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {

                textArea1.setText("jhggjhg\nhugffsrdtfg\ngfdrtdf\nhgftrsdf\nytfresrdcfvg\nuytyrdtesrdfgg\ntdrfygvhct\njh"
                        + "gfda\njftyuyiugcf\nhfuygihvftyughbuy\nhgyuftydfhgfyc\ndstryrfdts");
                //A long enough String
                JScrollBar jb = scrollPane1.getVerticalScrollBar();
                jb.setValue(jb.getMinimum());
                scrollPane1.repaint();
            }
        });
btn2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JScrollBar VerticalScrollBar =  scrollPane1.getVerticalScrollBar();
                VerticalScrollBar.setValue(VerticalScrollBar.getMinimum());

                scrollPane1.repaint();
            }
        });
因此,第一个按钮的功能是:“添加一些文本并滚动到顶部”

但它只会添加文本,而不会滚动到顶部

但是,对于第二个按钮,我添加了一个actionListener,如下所示:

btn1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {

                textArea1.setText("jhggjhg\nhugffsrdtfg\ngfdrtdf\nhgftrsdf\nytfresrdcfvg\nuytyrdtesrdfgg\ntdrfygvhct\njh"
                        + "gfda\njftyuyiugcf\nhfuygihvftyughbuy\nhgyuftydfhgfyc\ndstryrfdts");
                //A long enough String
                JScrollBar jb = scrollPane1.getVerticalScrollBar();
                jb.setValue(jb.getMinimum());
                scrollPane1.repaint();
            }
        });
btn2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JScrollBar VerticalScrollBar =  scrollPane1.getVerticalScrollBar();
                VerticalScrollBar.setValue(VerticalScrollBar.getMinimum());

                scrollPane1.repaint();
            }
        });
所以,我在按下第一个按钮后再按下第二个按钮,第二个按钮会很好地执行。
我真的很困惑为什么第一个按钮不会滚动到顶部:一个简单的解决方案可能是使用
JTextArea#setCaretPosition

import java.awt.BorderLayout;
import java.awt.EventQueue;
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.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextArea ta;

        public TestPane() {
            setLayout(new BorderLayout());
            ta = new JTextArea(5, 20);
            add(new JScrollPane(ta));

            JButton btn = new JButton("Add and to top");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    ta.setText("jhggjhg\nhugffsrdtfg\ngfdrtdf\nhgftrsdf\nytfresrdcfvg\nuytyrdtesrdfgg\ntdrfygvhct\njh"
                            + "gfda\njftyuyiugcf\nhfuygihvftyughbuy\nhgyuftydfhgfyc\ndstryrfdts");
                    ta.setCaretPosition(0);
                }
            });

            add(btn, BorderLayout.SOUTH);
        }


    }

}
我曾尝试过使用
scrollRectToVisible
,但最终不得不使用
SwingUtilites.invokeLater
使其工作,例如

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        ta.scrollRectToVisible(new Rectangle(0, 0, 10, 10));
    }
});

所以我想说,
setCaretPosition
在这种情况下是更简单的解决方案

例如,一个简单的解决方案可能是使用
JTextArea#setCaretPosition

import java.awt.BorderLayout;
import java.awt.EventQueue;
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.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextArea ta;

        public TestPane() {
            setLayout(new BorderLayout());
            ta = new JTextArea(5, 20);
            add(new JScrollPane(ta));

            JButton btn = new JButton("Add and to top");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    ta.setText("jhggjhg\nhugffsrdtfg\ngfdrtdf\nhgftrsdf\nytfresrdcfvg\nuytyrdtesrdfgg\ntdrfygvhct\njh"
                            + "gfda\njftyuyiugcf\nhfuygihvftyughbuy\nhgyuftydfhgfyc\ndstryrfdts");
                    ta.setCaretPosition(0);
                }
            });

            add(btn, BorderLayout.SOUTH);
        }


    }

}
我曾尝试过使用
scrollRectToVisible
,但最终不得不使用
SwingUtilites.invokeLater
使其工作,例如

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        ta.scrollRectToVisible(new Rectangle(0, 0, 10, 10));
    }
});

所以我想说
setCaretPosition
在这种情况下是一个更简单的解决方案

你可以使用
JTextArea#scrollRectToVisible
,传递它类似于
新矩形(0,0,1,1)
是的,他(@MadProgrammer)说的!你可以使用类似于
JTextArea#scrollRectToVisible
,传递它类似于
新矩形(0,0,1,1)
是的,就像他(@MadProgrammer)说的那样!