Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使jscrollpane从头到尾滚动?_Java_Jscrollpane - Fatal编程技术网

Java 如何使jscrollpane从头到尾滚动?

Java 如何使jscrollpane从头到尾滚动?,java,jscrollpane,Java,Jscrollpane,我正在尝试使jscorllpane从开始到结束自动滚动。我对verticalbar使用设置值方法,但它不起作用。如何使其滚动? 这是我的代码:当我运行这段代码时,它只是跳转到jscorllpane的末尾,而不是一步一步地搜索 import java.awt.event.*; import javax.swing.*; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; impor

我正在尝试使jscorllpane从开始到结束自动滚动。我对verticalbar使用设置值方法,但它不起作用。如何使其滚动? 这是我的代码:当我运行这段代码时,它只是跳转到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);
    }
}
导入java.awt.event.*;
导入javax.swing.*;
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
类JSCRollPaneToopAction实现ActionListener{
JScrollPane滚动窗格;
公共JScrollPaneToTopAction(JScrollPane滚动窗格){
如果(滚动窗格==null){
抛出新的IllegalArgumentException(“JScrollPaneTopAction:null JScrollPane”);
}
this.scrollPane=滚动窗格;
}
已执行的公共无效操作(ActionEvent ActionEvent){
run();
}
公开募捐{
JScrollBar verticalBar=scrollPane.getVerticalScrollBar();
int i=verticalBar.getMinimum();
而(i
我认为问题在于您对重新绘制的调用排队等待EDT计算,但EDT正忙于执行您的actionPerformed。EDT将仅在run()完成后执行重新绘制请求。这就是为什么你只能看到最后的结果

我不确定我能不能说清楚。。。检查此代码,它适用于我:

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);
    }
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JScrollBar;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.SwingUtilities;
类JSCRollPaneToopAction实现ActionListener,Runnable{
JScrollPane滚动窗格;
公共JScrollPaneToTopAction(JScrollPane滚动窗格){
如果(滚动窗格==null){
抛出新的IllegalArgumentException(“JScrollPaneTopAction:null JScrollPane”);
}
this.scrollPane=滚动窗格;
}
@凌驾
已执行的公共无效操作(ActionEvent ActionEvent){
新线程(this.start();
}
@凌驾
公开募捐{
JScrollBar verticalBar=scrollPane.getVerticalScrollBar();
int i=verticalBar.getMinimum();
而(i

我希望它能有所帮助。

第一次运行循环时,它会将滚动条值设置为
2*verticalBar.getMinimum()
。这是故意的吗?也不要在事件侦听器中执行长操作(尤其是使用
线程.sleep
)的任何操作!改用新线程。如果最小值不等于0,则应跳转。此外,如果最大值小于50,它也将直接跳到末尾。欢迎:-)如果此答案解决了您的问题,您可以将其标记为正确,以便其他人将从中受益,他们可能也有相同的问题。很高兴知道这有帮助:-)