Java:如何使滚动条以恒定速度滚动?

Java:如何使滚动条以恒定速度滚动?,java,swing,animation,timer,jscrollbar,Java,Swing,Animation,Timer,Jscrollbar,我想做一个JavaGUI程序。它包含一个jScrollpane,其中包含一个大jPanel。JPanelIt'sSelf包含许多Swing组件,如jButtons、jPanels和。我想要的是,当用户单击jButton时,jScrollpane开始以恒定的速度滚动到大面板的末尾。类似于安卓操作系统。 正如我所知,我必须知道如何用java制作动画来解决这个问题,我试图简单地用线程来解决这个问题,但这是不可能的,而且swing似乎需要更具体地使用线程。。。 你能告诉我你的想法吗?和Swingwork

我想做一个JavaGUI程序。它包含一个jScrollpane,其中包含一个大jPanel。JPanelIt'sSelf包含许多Swing组件,如jButtons、jPanels和。我想要的是,当用户单击jButton时,jScrollpane开始以恒定的速度滚动到大面板的末尾。类似于安卓操作系统。 正如我所知,我必须知道如何用java制作动画来解决这个问题,我试图简单地用线程来解决这个问题,但这是不可能的,而且swing似乎需要更具体地使用线程。。。 你能告诉我你的想法吗?和Swingworker有关吗? 真的很关键…:(

更新:我试图用timer类解决这个问题:

       ActionListener action = new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            if (mainContainerScrollPane.getHorizontalScrollBar().getValue() == mainContainerScrollPane.getHorizontalScrollBar().getMaximum())
                timer.stop();
            mainContainerScrollPane.getHorizontalScrollBar().setValue(mainContainerScrollPane.getHorizontalScrollBar().getValue() + 5);
            mainContainerScrollPane.repaint();
        }
    };

    timer = new Timer(10, action);
    timer.start();

现在的问题是动画没有顺利完成。我的意思是,它可以顺利滚动,但当它到达特定位置时,速度会下降。为什么?

一般来说,任何更改GUI组件的事件都应该在事件调度线程(EDT)上运行。您可以使用swing
计时器
在EDT上触发重复事件,如本教程中所述。在计时器事件上,您可以将滚动条的值增加到新位置的任何位置。以相同的增量重复此操作,以获得所需的效果。

只有一个问题,我在更新中所说的……其中问题来自于?可能它无法在10毫秒时跟上计时器。尝试将计时器减慢一点。同时确保检查是否大于或等于最大值,以防最大值不是5的增量。是的,问题在我将10更改为100时得到解决。但这不是我想要的,因为它不会产生我想要的那么快的动画。我可以不要每次都增加滚动条的附加值。因为这样做不会产生平滑的动画。我不熟悉SwingWworker…这能解决问题吗?如果不能,请给我你的好主意朋友:)10到100之间的X个不同值。另外,不要每次在actionPerformed中调用getHorizontalScrollbar和getMaxValue,而是在循环外部获取这些值。SwingWorker在这里不会帮忙的。它是用来做长时间运行的后台任务。现在它变得更好了!塔克斯。但是为什么,为什么定时器限制我们选择延迟时间?