Java JScrollPane的滚动事件

Java JScrollPane的滚动事件,java,swing,event-handling,jscrollpane,Java,Swing,Event Handling,Jscrollpane,奇怪的是,JScrollPane没有方法addAdjustmentListener()。然而,据说adjustmentListener与滚动条一起使用。无论何时以任何一种方式滚动JScrollPane,我都希望发生一些事情。如何实现这一点?为什么不获取实际的滚动条,然后向其中添加调整侦听器JScrollBar有一个名为addAdjustmentListener()的方法 您可以使用getVerticalScrollBar()和getHorizontalScrollBar()从JScrollPan

奇怪的是,
JScrollPane
没有方法
addAdjustmentListener()
。然而,据说adjustmentListener与滚动条一起使用。无论何时以任何一种方式滚动
JScrollPane
,我都希望发生一些事情。如何实现这一点?

为什么不获取实际的滚动条,然后向其中添加调整侦听器
JScrollBar
有一个名为
addAdjustmentListener()
的方法


您可以使用
getVerticalScrollBar()
getHorizontalScrollBar()
JScrollPane
获取
JScrollBar
,而不是尝试从JScrollPane中侦听更改,而是获取该滚动窗格的视口并向其添加更改侦听器:

例如(old.good.forums.sun.com)

import java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Random;
导入javax.swing.*;
公共类TilePainter扩展JPanel实现可滚动{
私有静态最终长serialVersionUID=1L;
私人最终内部瓷砖尺寸=50;
私人最终积分瓦块计数=100;
私人最终int visibleTiles=10;
已加载专用最终布尔值[][];
私有最终布尔值[][]加载;
私有最终随机;
公共瓷砖(){
setPreferredSize(新维度(平铺大小*平铺数量,平铺大小*平铺数量));
loaded=新布尔值[TILE_COUNT][TILE_COUNT];
加载=新布尔值[TILE_COUNT][TILE_COUNT];
随机=新随机();
}
公共布尔getTile(final int x,final int y){
布尔canPaint=加载的[x][y];
如果(!canPaint&!加载[x][y]){
加载[x][y]=真;
计时器计时器=新计时器(随机.nextInt(500),
新建ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
加载的[x][y]=真;
重新喷漆(x*瓷砖尺寸,y*瓷砖尺寸,瓷砖尺寸,瓷砖尺寸);
}
});
timer.setRepeats(假);
timer.start();
}
返回油漆;
}
@凌驾
受保护组件(图形g){
超级组件(g);
矩形剪辑=g.getClipBounds();
int startX=clip.x-(clip.x%瓷砖尺寸);
int startY=clip.y-(clip.y%瓷砖尺寸);
用于(int x=startX;x
根据Jesse Barnum:

// requiring that you already have JPanel additionsPane inside 
//  JScrollPane additionsScrollPane inside JFrame frame ...

additionsScrollPane.getViewport().addChangeListener(new ListenAdditionsScrolled());

public class ListenAdditionsScrolled implements ChangeListener{
    public void stateChanged(ChangeEvent e){
        additionsPane.revalidate();
        frame.repaint();
    }
}

我发现这是最好的方法。我甚至在下面粘贴了我的支持代码。谢谢,尤金。
// requiring that you already have JPanel additionsPane inside 
//  JScrollPane additionsScrollPane inside JFrame frame ...

additionsScrollPane.getViewport().addChangeListener(new ListenAdditionsScrolled());

public class ListenAdditionsScrolled implements ChangeListener{
    public void stateChanged(ChangeEvent e){
        additionsPane.revalidate();
        frame.repaint();
    }
}