java默认的JscrollPanel,当内容区域大于可显示区域时,滑动滚动条,区域也会随之滚动显示,但是我现在不想要这样的效果。我想要的效果是:A.当拖拽滚动条时,区域不会随之显示滚动。
                B.当拖拽停止时,区域再显示应该显示的部分。当前我首要的难题是如何将JscrollPanel原来的效果去掉,即A效果。好像应该是把滚动条的那些监听器去掉吧。我不是很熟,请高手指教。多谢!!~~

解决方案 »

  1.   

    偌大的csdn,竟然没有人出来帮我解决问题吗?
      

  2.   

    用thisScrollPane.addMouseWheelListener()把原来的listener覆盖掉就行了,具体可以找找网上的示例
      

  3.   

    快速定位这个问题倒是不大,按比例算一下就可以了,关键是覆盖listener这个方法不行,我试了一下,还是会滚动。
      

  4.   

    ScrollBar 与 JViewport 之间的 event 连接的代码貌似是在 UI 里面实现的,所以这个就暂时不要去想改了。可以动脑筋的地方就是:1 - JScrollPane 的 getVerticalScrollBar(), setVerticalScrollBar(JScrollBar) 都是 public 的,所以 ScrollBar 可以有很多办法换成你自己的,水平的bar也一样2 - JScrollBar 里面, fireAdjustmentValueChanged() 这个方法是 protected ,可以给它重写,利用一个 Timer 和一个 boolean 类型的 flag 来实现延迟的 event 发送,即当 value 停在一个点多少毫秒不变以后才发送event,具体的实现可以参考 JViewport 里面那个延迟300毫秒重绘的实现。
      

  5.   

    14楼说的方法可以实现延迟,但是要捕捉 mouseReleased 还是不行,这里面有不少问题:1 - 自己捕捉 mouseEvent, mouseEvent 和 keyEvent 都是不怎么靠得住的 event,容易被上层截留,ScrollBarUI 里面貌似用了 ActionMap2 - 鼠标松开的时候才刷新JViewport, 那鼠标滚轮事件又怎么处理呢?3 - 从 JScrollBar 现有的实现改成你需要的行为,即使能够实现,可能也需要不少的hack,而且不一定能保证所有平台都能有一样的行为。
      

  6.   

    鼠标滚轮是可以调滚动速度的,jScrollPane1.getVerticalScrollBar().setUnitIncrement(毫秒);
    这样可以把滚动速度调快点的。
      

  7.   


    是的,虽然更推荐的方式是你加进 JScrollPane 里的组件自己实现 Scrollable 接口,然后提供一个它喜欢的 unit increment如果你单纯是担心内容太多,滚动条滚动的时候会卡,一般不用担心,JViewport的实现里面对此有优化,滚动条停在一个地方300毫秒才会真正引发 JViewport 重绘,如果这样还卡,那是你其他的地方设计可能有问题。
      

  8.   


    另外,那个不是毫秒,而是value改变的单位数。