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();
}
}