如何让jscrollpane从头到尾滚动?

how to make a jscrollpane scroll from the start to the end?

我正在尝试让 jscorllpane 从头到尾自动滚动。我对垂直条使用设置值方法,但它不起作用。我怎样才能让它滚动? 这是我的代码:当我 运行 这段代码时,它只是跳转到 jscorllpane 的末尾,而不是逐步滚动

import java.awt.event.*;
import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class JScrollPaneToTopAction implements ActionListener {
    JScrollPane scrollPane;

    public JScrollPaneToTopAction(JScrollPane scrollPane) {
        if (scrollPane == null) {
            throw new IllegalArgumentException("JScrollPaneToTopAction: null JScrollPane");
        }
        this.scrollPane = scrollPane;
    }

    public void actionPerformed(ActionEvent actionEvent) {
        run();
    }

    public void run() {
        JScrollBar verticalBar = scrollPane.getVerticalScrollBar();
        int i = verticalBar.getMinimum();
        while (i < verticalBar.getMaximum()) {
            verticalBar.setValue(verticalBar.getMinimum()+i);
            i += 50;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            scrollPane.getParent().invalidate();
            scrollPane.repaint();
            scrollPane.invalidate();
            System.out.println("changing " + i);
        }
    }

}

public class Draft20 {

    public static void main(String args[]) {
        JFrame frame = new JFrame("Tabbed Pane Sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextArea tr = new JTextArea();

        JLabel label = new JLabel("Label");
        label.setPreferredSize(new Dimension(1000, 1000));
        JScrollPane jScrollPane = new JScrollPane(label);

        JButton bn = new JButton("Move");

        bn.addActionListener(new JScrollPaneToTopAction(jScrollPane));

        frame.add(bn, BorderLayout.SOUTH);
        frame.add(jScrollPane, BorderLayout.CENTER);
        frame.setSize(400, 150);
        frame.setVisible(true);
    }
}

我认为问题是您对重绘的调用已排队等待 EDT 计算,但 EDT 正忙于执行您的 actionPerformed。 EDT 只会在 运行() 完成后执行您的重绘请求。这就是为什么您只能看到最终结果的原因。

我不确定我能否说清楚...检查这段代码,它对我有用:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

class JScrollPaneToTopAction implements ActionListener, Runnable {

    JScrollPane scrollPane;

    public JScrollPaneToTopAction(JScrollPane scrollPane) {
        if (scrollPane == null) {
            throw new IllegalArgumentException("JScrollPaneToTopAction: null     JScrollPane");
        }
        this.scrollPane = scrollPane;
    }

    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        new Thread(this).start();
    }

    @Override
    public void run() {
        JScrollBar verticalBar = scrollPane.getVerticalScrollBar();
        int i = verticalBar.getMinimum();
        while (i < verticalBar.getMaximum()) {
            verticalBar.setValue(verticalBar.getMinimum() + i);
            i += 50;
            try {
                Thread.sleep(100);
            }
            catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {
                    scrollPane.getParent().invalidate();
                    scrollPane.repaint();
                    scrollPane.invalidate();
                }
            });
            System.out.println("changing " + i);
        }
    }
}

public class Draft20 {

    public static void main(String args[]) {
        JFrame frame = new JFrame("Tabbed Pane Sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextArea tr = new JTextArea();

        JLabel label = new JLabel("Label");
        label.setPreferredSize(new Dimension(1000, 1000));
        JScrollPane jScrollPane = new JScrollPane(label);

        JButton bn = new JButton("Move");

        bn.addActionListener(new JScrollPaneToTopAction(jScrollPane));

        frame.add(bn, BorderLayout.SOUTH);
        frame.add(jScrollPane, BorderLayout.CENTER);
        frame.setSize(400, 150);
        frame.setVisible(true);
    }
}

希望对您有所帮助。