如何使用JScrollPane连续滚动

时间:2016-01-23 23:24:56

标签: java swing scroll jscrollpane

我使用JScrollPane来包含大型JPanel。当鼠标不在JScrollPane的范围内时,我希望它向那个方向滚动。例如,如果JScrollPane的顶部位于(100,100)并且鼠标位于组件的顶部之上,我希望它向上滚动。

到目前为止,我发现了这个:

private Point origin;

在构造函数中......

addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
        origin = new Point(e.getPoint());
    }
});
addMouseMotionListener(new MouseAdapter() {
    public void mouseDragged(MouseEvent e) {
        if (origin != null) {
            JViewport viewPort = (JViewport) SwingUtilities.getAncestorOfClass(JViewport.class, Assets.adder.viewer);
            if (viewPort != null) {
                Rectangle view = viewPort.getViewRect();
                if (e.getX() < view.x) view.x -= 2;
                if (e.getY() < view.y) view.y -= 2;
                if (view.x < 0) view.x = 0;
                if (view.y < 0) view.y = 0;
                if (e.getX() > view.x + view.getWidth()) view.x += 2;
                if (e.getY() > view.y + view.getHeight()) view.y += 2;
                scrollRectToVisible(view);
            }
        }
    }
});

这样可行,但它仅在鼠标运动时有效,否则无效。如何在鼠标位于JScrollPane之外时使其工作,但也不能移动?

1 个答案:

答案 0 :(得分:2)

查看JComponent类的setAutoScrolls(...)方法。

你可以使用:

panel.setAutoScrolls( true );

然后使用以下MouseMotionListener

 MouseMotionListener doScrollRectToVisible = new MouseMotionAdapter() {
     public void mouseDragged(MouseEvent e) {
        Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
        ((JPanel)e.getSource()).scrollRectToVisible(r);
    }
 };
 panel.addMouseMotionListener(doScrollRectToVisible);

这个概念在How to Use Scroll Panes的Swing教程中找到的ScollDemo示例中进行了演示。